不确定这是Spring 5. 0. 3的bug还是修复我这边的东西的新特性。
升级后,我得到这个错误。有趣的是,这个错误只在我的本地机器上。相同的代码在测试环境中与HTTPS协议工作正常。
继续...
我得到这个错误的原因是因为我加载生成的JSP页面的URL是/location/thisPage.jsp
。评估代码request.getRequestURI()
给我的结果/WEB-INF/somelocation//location/thisPage.jsp
。如果我把JSP页面的URL固定到这个location/thisPage.jsp
,事情就可以正常工作。
所以我的问题是,我是否应该从代码中的JSP
路径中删除/
,因为这是下一步所需的,或者Spring
引入了一个bug,因为我的机器和测试环境之间的唯一区别是协议HTTP
与HTTPS
。
org.springframework.security.web.firewall.RequestRejectedException: The request was rejected because the URL was not normalized.
at org.springframework.security.web.firewall.StrictHttpFirewall.getFirewalledRequest(StrictHttpFirewall.java:123)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:194)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:186)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:357)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:270)
8条答案
按热度按时间9rbhqvlz1#
Spring Security Documentation在请求中提到了阻塞//的原因。
例如,它可以包含路径遍历序列(如/../)或多个正斜杠(//),这也可能导致模式匹配失败。某些容器在执行servletMap之前将这些内容规范化,但其他容器不会。为了防止此类问题,FilterChainProxy使用HttpFirewall策略来检查和 Package 请求。默认情况下,未规范化的请求将被自动拒绝,并且为了匹配的目的去除路径参数和重复的斜线。
所以有两种可能的解决方案-
1.删除双斜线(首选方法)
1.通过使用以下代码自定义StrictHttpFirewall,在Spring Security中允许//。
步骤1创建自定义防火墙,允许URL中出现斜线。
步骤2然后在Websecurity中配置此Bean
第2步是可选步骤,Sping Boot 只需要声明一个类型为
HttpFirewall
的bean,它将在过滤器链中自动配置它。Spring安全5.4更新
在Spring security 5.4及更高版本(Sping Boot 〉= 2.4.0)中,我们可以通过创建下面的bean来消除太多抱怨请求被拒绝的日志。
gev0vcfq2#
setAllowUrlEncodedSlash(true)
对我不起作用。当有双斜杠时,内部方法isNormalized
仍然返回false
。我将
StrictHttpFirewall
替换为DefaultHttpFirewall
,只使用以下代码:对我来说还不错。
使用
DefaultHttpFirewall
有风险吗?ac1kyiln3#
我遇到了同样的问题:
Spring Boot 版本= 1.5.10
Spring Security版本= 4.2.4
此问题发生在端点上,其中定义的
ModelAndView
viewName前面带有 * 正斜杠 *。示例:如果我去掉斜线,效果很好。例如:
我还用 RedirectView 做了一些测试,它似乎可以在前面加一个正斜杠。
pkmbmrz74#
一旦我使用双斜线,而调用的API,然后我得到了同样的错误。
我不得不调用http://localhost:8080/getSomething,但我确实喜欢http://localhost:8080//getSomething。我通过删除额外的斜杠来解决它。
kqhtkvqz5#
在我的例子中,从spring-securiy-web 3.1.3升级到4.2.12,默认情况下
defaultHttpFirewall
从DefaultHttpFirewall
更改为StrictHttpFirewall
,因此只需在XML配置中定义它,如下所示:将
HTTPFirewall
设置为DefaultHttpFirewall
um6iljoc6#
下面的解决方案是一个干净的变通办法。它不会危及安全,因为我们使用相同的严格防火墙。
固定步骤如下:
第1步:创建一个覆盖StrictHttpFirewall的类,如下所示。
步骤2:创建防火墙响应类
步骤3:创建自定义筛选器以抑制RejectedException
**第4步:**在安全配置中将自定义过滤器添加到Spring过滤器链
现在使用上述修复,我们可以处理
RequestRejectedException
与错误404页。z4bn682m7#
在我的例子中,这个问题是由于没有登录Postman而引起的,所以我在另一个标签页中打开了一个连接,这个连接使用了我从Chrome会话的标题中获取的会话cookie。
chhqkbe18#
我的工作: