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
バックポートされたと思いますか?
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+で動作しますが、当然ながらリスクも伴います!
Крис で述べたように、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として設定されます。
次の2つの組み合わせを使用しました
The request was rejected because the URL contained a potentially malicious String ";"
を解決しました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);
}