我看到一吨的RequestRejectedException条目在我的Tomcat日志(样品粘贴下面).几个月前,经过次要版本升级(Spring Security 4.2.4,IIRC)之后,这些内容开始出现在我的日志文件中,所以这显然是Spring中默认启用的新安全功能.这里报告了类似的问题,但我的问题具体涉及如何在控制器中拦截这些异常.针对此问题记录了一个Spring Security错误(提供一种处理RequestRejectedException的方法).但是,在Spring 5.1之前,它们并未针对此问题进行修复.
我想获得对此功能的一些控制,以便:
500 Internal Server Error(这是非常不正确的,这应该是a 400 Bad Request).我想找到一种方法来记录所请求的URL,但也要专门针对这些异常禁止堆栈跟踪,因为它们会在不给我任何有用信息的情况下污染我的日志文件.最理想的情况是,我想拦截这些异常并在我的应用程序层中处理它们,而不是在Tomcat日志中报告它们.
例如,这是我每天出现的数千个日志条目之一catalina.out:
Aug 10, 2018 2:01:36 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [dispatcher] in context with path [] threw exception
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:265)
at org.springframework.security.web.firewall.StrictHttpFirewall.getFirewalledRequest(StrictHttpFirewall.java:245)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:193)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:347)
at …Run Code Online (Sandbox Code Playgroud) 升级到spring security 4.2.4后,我发现StrictHttpFirewall现在是默认设置.不幸的是,它与弹簧MVC @MatrixVariable的效果不佳,因为";" 是不允许的.怎么解决这个问题?
例:
@GetMapping(path = "/{param}")
public void example(@PathVariable String param,
@MatrixVariable Map<String, String> matrix) {
//...
}
Run Code Online (Sandbox Code Playgroud)
这可以像这样调用:
mockMvc.perform(get("/someparam;key=value"))
Run Code Online (Sandbox Code Playgroud)
并填充矩阵图.现在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)
Run Code Online (Sandbox Code Playgroud)
我可以使用一个允许分号的自定义HttpFirewall.有没有办法在不使用禁用字符的情况下使用@MatrixVariable?
以来:
5.0.1
我想这是向后移植的?
我在生产中遇到大量错误
org.springframework.security.web.firewall.RequestRejectedException: The request was rejected because the URL was not normalized.
Run Code Online (Sandbox Code Playgroud)
据推测,这是由//我的网址中的a引起的,但我不知道它们来自何处。我怎么知道是什么URL造成的呢?当您不知道发生了什么时很难修复。
我的确意识到有一个相关的问题,但这并没有解决如何诊断问题URL。它仅解决如何关闭严格的防火墙。
我正在尝试将 Spring 应用程序迁移到 Spring Boot。在 tomcat 服务器上运行应用程序时,出现以下错误:
由于 URL 未规范化,请求被拒绝。
我尝试在我的入口点类中添加以下 bean 来解决错误。
@Bean
public InternalResourceViewResolver jspViewResolver() {
InternalResourceViewResolver bean = new InternalResourceViewResolver();
bean.setPrefix("/WEB-INF/ui/");
bean.setSuffix(".jsp");
return bean;
}
@Bean
public HttpFirewall allowUrlEncodedSlashHttpFirewall() {
StrictHttpFirewall firewall = new StrictHttpFirewall();
firewall.setAllowUrlEncodedSlash(true);
return firewall;
}
@Bean
public StrictHttpFirewall httpFirewall() {
StrictHttpFirewall firewall = new StrictHttpFirewall();
firewall.setAllowSemicolon(true);
return firewall;
}
@Bean
public HttpFirewall defaultHttpFirewall() {
return new DefaultHttpFirewall();
}
public void configure(WebSecurity web) throws Exception {
web.httpFirewall(allowUrlEncodedSlashHttpFirewall());
}
Run Code Online (Sandbox Code Playgroud)
错误日志:
org.springframework.security.web.firewall.RequestRejectedException: The request was rejected …Run Code Online (Sandbox Code Playgroud)