🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
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; } ~~~