相关疑难解决方法(0)

如何在Spring中拦截RequestRejectedException?

我看到一吨RequestRejectedException条目在我的Tomcat日志(样品粘贴下面).几个月前,经过次要版本升级(Spring Security 4.2.4,IIRC)之后,这些内容开始出现在我的日志文件中,所以这显然是Spring中默认启用的新安全功能.这里报告了类似的问题,但我的问题具体涉及如何在控制器中拦截这些异常.针对此问题记录了一个Spring Security错误(提供一种处理RequestRejectedException的方法).但是,在Spring 5.1之前,它们并未针对此问题进行修复.

我理解为什么抛出这些异常,我不想禁用此安全功能.

我想获得对此功能的一些控制,以便:

  1. 我知道我不会阻止合法用户访问我的网站.
  2. 我可以看到哪些请求会触发这个(它们是SQL注入攻击吗?)
  3. 我可以调整服务器响应.Spring Security防火墙将完整的堆栈跟踪转储到Web客户端(信息泄露)以及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)

java logging spring exception-handling spring-security

21
推荐指数
4
解决办法
6184
查看次数

StrictHttpFirewall在spring security 4.2 vs spring MVC @MatrixVariable

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

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

我想这是向后移植的?

spring-mvc spring-security

15
推荐指数
2
解决办法
2万
查看次数

春季“由于未规范化URL,请求被拒绝。” 如何判断使用了什么网址?

我在生产中遇到大量错误

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。它仅解决如何关闭严格的防火墙。

java spring spring-security spring-boot

5
推荐指数
1
解决办法
2785
查看次数

为什么 Spring Boot 会因为 URL 未规范化而拒绝 GET 请求?

我正在尝试将 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)

java authentication spring-boot

3
推荐指数
1
解决办法
9120
查看次数