StrictHttpFirewall在spring security 4.2 vs spring MVC @MatrixVariable

时间:2018-02-02 10:23:12

标签: spring-mvc spring-security

升级到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?

BTW:javadoc不正确https://docs.spring.io/autorepo/docs/spring-security/4.2.x/apidocs/index.html?org/springframework/security/web/firewall/StrictHttpFirewall.html

  

自:

     

5.0.1

我猜它是向后移植的?

3 个答案:

答案 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)

我使用了以下两个的组合

  1. https://stackoverflow.com/a/48636757/6780127
  2. https://stackoverflow.com/a/30539991/6780127

  • 第一个解决了 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);
}