web-dev-qa-db-ja.com

Spring Security 4.2のStrictHttpFirewallとSpring MVC @MatrixVariable

Spring Security 4.2.4にアップグレードして、StrictHttpFirewallがデフォルトになったことを発見しました。残念ながら、「;」以降のSpring MVC @MatrixVariableではうまく機能しません。もう許可されていません。それを回避する方法は?

例:

@GetMapping(path = "/{param}")
public void example(@PathVariable String param,
                    @MatrixVariable Map<String, String> matrix) {
    //...
}

これは次のように呼び出すことができます。

mockMvc.perform(get("/someparam;key=value"))

そして、マトリックスマップが作成されます。今春のセキュリティはそれをブロックします。

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を使用する方法はありますか?

ところで: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

バックポートされたと思いますか?

14
Крис

StrictHttpFirewallのカスタム定義インスタンスを使用して、デフォルトのスプリングセキュリティファイアウォールを希釈できます(自己責任で)

@Bean
public HttpFirewall allowUrlEncodedSlashHttpFirewall() {
    StrictHttpFirewall firewall = new StrictHttpFirewall();
    firewall.setAllowUrlEncodedSlash(true);
    firewall.setAllowSemicolon(true);
    return firewall;
}

そして、WebSecurityでこのカスタムファイアウォールBeanを使用します(スプリングブートはこの変更を必要としません)

@Override
public void configure(WebSecurity web) throws Exception {
  super.configure(web);
  // @formatter:off
  web.httpFirewall(allowUrlEncodedSlashHttpFirewall());
...
}

これはSpring Security 4.2.4+で動作しますが、当然ながらリスクも伴います!

26
Munish Chandel

Крис で述べたように、XMLアプローチを使用したい場合は、securityContext.xml(または、スプリングセキュリティ関連のxml-configが呼び出されるもの)に次の部分を追加できます。

<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として設定されます。

4
morten.c

次の2つの組み合わせを使用しました

  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 ";"を解決しました
  • 2番目はSpring MVC Missing matrix variableを解決しました

Spring WebでSpring Securityを使用しているため、両方を実行する必要があり、問題は解決されました。

@MatrixVariable次のパターンを使用すると便利です。 {num}として使用するには、最初にUrl @MatrixVariableに言及する必要があります

@RequestMapping(method = RequestMethod.GET,value = "/test{num}")
@ResponseBody
public ResponseEntity<String> getDetail(@MatrixVariable String num){
    return new ResponseEntity<>("test"+num, HttpStatus.OK);
}
0
Swapnil Nakate