春季安全性、尾随斜杠和 URL 中的点

2022-09-02 13:25:13

我使用Spring Security 3.1.4来保护部署到Tomcat的Spring MVC 3.2.4应用程序。我有以下Spring Security配置:

<http auto-config="true" use-expressions="true">
   <http-basic />
   <logout ... />
   <form-login ... />

   <intercept-url pattern="/" access="isAnonymous() or hasRole('ROLE_USER')" />
   <intercept-url pattern="/about" access="isAnonymous() or hasRole('ROLE_USER')" />
   <intercept-url pattern="/login" access="isAnonymous() or hasRole('ROLE_USER')" />
   <intercept-url pattern="/under-construction" access="isAnonymous() or hasRole('ROLE_USER')" />
   <intercept-url pattern="/admin-task*" access="hasRole('ROLE_USER') and hasRole('ROLE_ADMINISTRATOR')" />
   <intercept-url pattern="/resources/**" access="isAnonymous() or hasRole('ROLE_USER')" />
   <intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
</http>

我注意到没有尾部斜杠的URL模式(例如,)与带有尾部斜杠的URL不匹配(例如,),反之亦然。换句话说,带有斜杠的URL和不带斜杠的相同URL被Spring Security视为两个不同的URL。可以使用两个安全规则来解决此问题:/about/about/

<intercept-url pattern="/about" access="isAnonymous() or hasRole('ROLE_USER')" />
<intercept-url pattern="/about/" access="isAnonymous() or hasRole('ROLE_USER')" />

有没有更好的解决方案?

我知道这允许使用正则表达式定义URL模式,但是如果可能的话,我想避免任何不必要的复杂性。path-type="regex"

更新

正如Adam Gent所指出的,还有一个问题涉及带有点的URL:并且被Spring MVC视为相同的URL。但是,Spring Security将它们视为两个不同的URL。因此,可能需要多一个安全规则:/about.foo/about

<intercept-url pattern="/about.*" .../>

答案 1

弹簧安全 4.1+

Spring Security现在添加了一个新的匹配器,该匹配器可以识别您的Spring MVC URL匹配配置。这告诉Spring Security根据Spring MVC使用的相同规则匹配路径,从而消除了URL有效但不安全的可能性。

首先,您需要用新的MVC匹配器替换任何旧的匹配器。Spring Security现在与您配置了Spring MVC同步,因此您可以自由添加或删除任何路径匹配配置。我建议尽可能坚持使用默认值。

Java Config

如果您使用的是 ,则现在应该使用 :antMatchersmvcMatchers

protected configure(HttpSecurity http) throws Exception {
  http.authorizeRequests()
        .mvcMatchers("/about").hasRole("USER");
}

XML Config

您需要将该属性添加到代码中:request-matcherhttp

<http request-matcher="mvc">
  <intercept-url pattern="/about" access="hasRole('USER')"/>
</http>

完整参考

请注意,您也不应该再以“ROLE_”作为角色前缀,因为Spring Security会自动为您执行此操作。


春季安防4.1之前

我无法找到一种方法来处理Spring Security中的尾随斜杠和路径后缀。显然,可以编写正则表达式来处理这些情况,但这似乎使安全规则过于复杂并且容易出错。我想尽可能自信,我不会意外地暴露资源。

因此,我的方法是通过在Spring中禁用此行为,方法是将路径匹配器配置为对尾部斜杠和后缀都严格。

Java Config

@Configuration
public class ServletConfig extends WebMvcConfigurerAdapter {
  @Override
  public void configurePathMatch(final PathMatchConfigurer configurer) {
    configurer.setUseSuffixPatternMatch(false);
    configurer.setUseTrailingSlashMatch(false);
  }
}

XML Config

<mvc:annotation-driven>
  <mvc:path-matching suffix-pattern="false" trailing-slash="false" />
</mvc:annotation-driven>

答案 2
<intercept-url pattern="/about/**"...

也适用于春季安全3.1.4。这样可以保护 、 和/about/about//about/anything_else


推荐