spring-security - 如何在 saml 中解决 firewall.RequestRejectedException
问题描述
将安全版本升级到 4.2.4 后,
对于包含分号的 url,我们得到了以下异常
前任:
https://url/name=somevalue;value=somevalue
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) ~[spring-security-web-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.security.web.firewall.StrictHttpFirewall.getFirewalledRequest(StrictHttpFirewall.java:120) ~[spring-security-web-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:193) ~[spring-security-web-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:185) ~[spring-security-web-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) ~[spring-security-web-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) ~[spring-security-web-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) ~[spring-security-web-4.2.4.RELEASE.jar:4.2.4.RELEASE]
所以,我们对 httpfirewall 的自定义实现做了一些配置
@Bean
public HttpFirewall allowUrlEncodedSlashHttpFirewall()
{
StrictHttpFirewall firewall = new StrictHttpFirewall();
firewall.setAllowUrlEncodedSlash(true);
firewall.setAllowSemicolon(true);
return firewall;
}
和
@Override
public void configure(WebSecurity web) throws Exception
{
super.configure(web);
web.httpFirewall(this.httpFirewall);
}
配置后,我们面临同样的问题。
然后我调试了内置类StrictHttpFirewall.getFirewalledRequest(HttpServletRequest request)
有时我们会收到嵌套请求,例如:
firewalledRequest[ firewallwedRequest [ … (request).
我检查了dofilter()
方法filterchainProxy
它没有清除SecurityContextHolder
,因此FilterChainProxy
实际上在链中发生了两次。
解决方案
推荐阅读
- reactjs - 从侧边栏反应在内容组件中打开反应引导模式
- html - 将浏览器地址栏中的可搜索关键字配置为我网站的 url
- python - 如何获得熊猫日期时间系列的最小值和另一个日期时间系列的(常数)最大值?
- python - 如何加入迭代中制作的 df 以构建大 df?
- jobs - 一旦主容器在 Jobs/Cron Jobs 中终止,就杀死 Sidecar 容器
- python - 在 sagemath 中访问置换群的元素
- c# - 基于 DataTable 的 NuGet 包舍入到小数点后 2 位
- python - 如何使用 xpath 在 selenium 中进行文本框输入
- python - _ArrayMemoryError: 无法分配
- python - 如何在 Python/Mysql 中迭代日期?'datetime.date' 不可迭代"