Spring Security有几个区域,您定义的模式将针对传入请求进行测试,以决定如何处理请求。 当`FilterChainProxy`决定应该传递请求的过滤器链以及`FilterSecurityInterceptor`何时决定哪些安全性约束适用于请求时,会发生这种情况。 在针对您定义的模式进行测试时,了解机制是什么以及使用什么URL值非常重要。
Servlet规范定义了`HttpServletRequest`的几个属性,这些属性可以通过getter方法访问,我们可能希望与之匹配。这些是`contextPath,servletPath,pathInfo和queryString`。 Spring Security只对保护应用程序中的路径感兴趣,因此将忽略`contextPath`。不幸的是,servlet规范没有准确定义`servletPath和pathInfo`的值将包含在特定请求URI中的内容。例如,URL的每个路径段可以包含参数,如RFC 2396 [8]中所定义。规范没有明确说明这些是否应该包含在`servletPath和pathInfo`值中,并且不同servlet容器之间的行为也不同。存在这样的危险:当应用程序部署在不从这些值中删除路径参数的容器中时,攻击者可以将它们添加到请求的URL中,以使模式匹配成功或意外失败。 [9]。传入URL的其他变体也是可能的。例如,它可能包含路径遍历序列(如/../)或多个正斜杠(//),这也可能导致模式匹配失败。一些容器在执行servlet映射之前将这些规范化,但其他容器则没有。为了防止这些问题,`FilterChainProxy`使用`HttpFirewall`策略来检查和包装请求。默认情况下会自动拒绝未规范化的请求,并且会删除路径参数和重复斜杠以进行匹配。 [10]。因此,必须使用`FilterChainProxy`来管理安全过滤器链。请注意,`servletPath和pathInfo`值由容器解码,因此您的应用程序不应包含任何包含分号的有效路径,因为这些部分将被删除以进行匹配。
如上所述,默认策略是使用Ant样式路径进行匹配,这可能是大多数用户的最佳选择。该策略在`AntPathRequestMatcher`类中实现,该类使用Spring的`AntPathMatcher`对连接的s`ervletPath和pathInfo`执行模式的不区分大小写的匹配,忽略queryString。
如果由于某种原因,您需要更强大的匹配策略,则可以使用正则表达式。然后策略实现是`RegexRequestMatcher`。有关更多信息,请参阅此类的Javadoc。
实际上,我们建议您在服务层使用方法安全性,以控制对应用程序的访问,而不是完全依赖于在Web应用程序级别定义的安全性约束。 URL发生变化,很难考虑应用程序可能支持的所有可能的URL以及如何操作请求。您应该尝试限制自己使用一些简单易懂的简单蚂蚁路径。始终尝试使用“默认拒绝”方法,其中您最后定义了一个全能通配符(/或)并拒绝访问。
在服务层定义的安全性更强大,更难以绕过,因此您应该始终利用Spring Security的方法安全选项。
`HttpFirewall`还通过拒绝HTTP响应标头中的新行字符来阻止HTTP响应拆分。
默认情况下使用`StrictHttpFirewall`。此实现拒绝看似恶意的请求。如果它对您的需求过于严格,那么您可以自定义拒绝的请求类型。但是,重要的是要知道这可以打开您的应用程序直至攻击。例如,如果您希望利用Spring MVC的Matrix变量,可以在XML中使用以下配置:
~~~
<b:bean id="httpFirewall"
class="org.springframework.security.web.firewall.StrictHttpFirewall"
p:allowSemicolon="true"/>
<http-firewall ref="httpFirewall"/>
~~~
java配置
~~~
@Bean
public StrictHttpFirewall httpFirewall() {
StrictHttpFirewall firewall = new StrictHttpFirewall();
firewall.setAllowSemicolon(true);
return firewall;
}
~~~
- 架构
- 9.技术概述
- 9.1 运行环境
- 9.2 核心组件
- 9.2.1 SecurityContextHolder, SecurityContext and Authentication Objects
- 9.2.2 The UserDetailsService
- 9.2.3 GrantedAuthority
- 9.2.4 总结
- 9.3 验证
- 9.3.1 在Spring Security中验证是什么
- 9.3.2 直接设置SecurityContextHolder内容
- 9.4 web应用中的验证
- 9.4.1 ExceptionTranslationFilter
- 9.4.2 AuthenticationEntryPoint
- 9.4.3 验证机制
- 9.4.4 在请求之间存储SecurityContext
- 9.5 Spring Security中的访问控制(授权)
- 9.5.1 Security and AOP Advice
- 9.5.2 Secure Objects and the AbstractSecurityInterceptor
- 什么是配置属性
- RunAsManager
- AfterInvocationManager
- 扩展安全对象模型
- 9.6 本地化
- 10 核心服务
- 10.1 The AuthenticationManager, ProviderManager and AuthenticationProvider
- 10.1.1 成功验证时擦除凭据
- 10.1.2 DaoAuthenticationProvider
- 10.2 UserDetailsService实现
- 10.2.1 In-Memory Authentication
- 10.2.2 JdbcDaoImpl
- Authority Groups
- 10.3 Password Encoding
- 10.3.1 密码发展史
- 10.3.2 DelegatingPasswordEncoder
- 密码存储格式
- 密码编码
- 密码比对
- 入门体验
- 排除故障
- 10.3.3 BCryptPasswordEncoder
- 10.3.4 Pbkdf2PasswordEncoder
- 10.3.5 SCryptPasswordEncoder
- 10.3.6 其他PasswordEncoders
- 10.4 Jackson的支持
- 11 测试方法安全
- 12 集成spring mvc测试
- 13 webflux支持
- 14 安全过滤器链
- 14.1 DelegatingFilterProxy
- 14.2 FilterChainProxy
- 14.2.1 绕过过滤链
- 14.3 过滤器顺序
- 14.4 匹配请求和http防火墙
- 14.5 与其他基于过滤器的框架一起使用
- 14.6 Advanced Namespace Configuration
- 15. 核心的安全过滤器
- 15.1 FilterSecurityInterceptor
- 15.2 ExceptionTranslationFilter
- 15.3 SecurityContextPersistenceFilter
- 15.4 UsernamePasswordAuthenticationFilter