升级到spring security 4.2.4我发现StrictHttpFirewall现在是默认值。 不幸的是,它与弹簧MVC @MatrixVariable并不合适,因为&#34 ;;"是不允许的。 如何解决这个问题?
示例:
@GetMapping(path = "/{param}")
public void example(@PathVariable String param,
@MatrixVariable Map<String, String> matrix) {
//...
}
可以这样调用:
mockMvc.perform(get("/someparam;key=value"))
将填充矩阵图。 现在Spring安全阻止了它。
org.springframework.security.web.firewall.RequestRejectedException: The request was rejected because the URL contained a potentially malicious String ";"
at org.springframework.security.web.firewall.StrictHttpFirewall.rejectedBlacklistedUrls(StrictHttpFirewall.java:140)
我可以使用允许分号的自定义HttpFirewall。 有没有办法在不使用禁用字符的情况下使用@MatrixVariable?
自:
5.0.1
我猜它是向后移植的?
答案 0 :(得分:21)
您可以使用自定义的StrictHttpFirewall实例稀释默认的弹簧安全防火墙(风险自负)
@Bean
public HttpFirewall allowUrlEncodedSlashHttpFirewall() {
StrictHttpFirewall firewall = new StrictHttpFirewall();
firewall.setAllowUrlEncodedSlash(true);
firewall.setAllowSemicolon(true);
return firewall;
}
然后在WebSecurity中使用此自定义防火墙bean(Spring启动不需要此更改)
@Override
public void configure(WebSecurity web) throws Exception {
super.configure(web);
// @formatter:off
web.httpFirewall(allowUrlEncodedSlashHttpFirewall());
...
}
这适用于Spring Security 4.2.4+,但当然会带来一些风险!
答案 1 :(得分:2)
正如Крис在评论中提到的,如果您更喜欢使用XML方法,则可以将以下部分添加到securityContext.xml(或与spring-security相关的xml-config所调用的任何内容)中: / p>
<bean id="allowSemicolonHttpFirewall"
class="org.springframework.security.web.firewall.StrictHttpFirewall">
<property name="allowSemicolon" value="true"/>
</bean>
<security:http-firewall ref="allowSemicolonHttpFirewall"/>
<bean>
部分定义了一个ID为StrictHttpFirewall
的新allowSemicolonHttpFirewall
bean,然后通过引用该ID在<security>
标签中将其设置为默认的http-firewall。 / p>
答案 2 :(得分:0)
我使用了以下两个的组合
The request was rejected because the URL contained a potentially malicious String ";"
Spring MVC Missing matrix variable
当我将Spring Security与Spring Web结合使用时,我必须同时执行这两项操作,并且此问题现在已解决。
我发现使用@MatrixVariable
以下模式很有用。必须首先提到网址{num}
才能将其用作@MatrixVariable
@RequestMapping(method = RequestMethod.GET,value = "/test{num}")
@ResponseBody
public ResponseEntity<String> getDetail(@MatrixVariable String num){
return new ResponseEntity<>("test"+num, HttpStatus.OK);
}