春天的秒:intercept-url很容易被绕过?

时间:2014-03-14 20:43:01

标签: java spring spring-mvc spring-security

在我们的Java应用程序中,我们使用Spring安全性来处理基于角色的授权。最近,我们意识到在web.xml中对多个servlet映射做了很多这些URL检查很容易被绕过。但是,在将其缩减为一个servlet映射之后,我仍然不确定我们的URL匹配器设置正确,因为它们非常容易绕过。例如:

 <sec:intercept-url pattern="/m/partner/list/**" access="hasRole('VIEW_ADMIN_PARTNER_LIST')"/>

乍一看,它确实会阻止具有VIEW_ADMIN_PARTNER_LIST角色的用户加载该页面...直到我将.html添加到其末尾。然后加载就好了。或者,如果我添加.fff或任何其他扩展程序,它都可以。所以,我们将模式改为:

 <sec:intercept-url pattern="/m/partner/list**" access="hasRole('VIEW_ADMIN_PARTNER_LIST')"/>

哪个效果很好!现在无论我添加到网址末尾的扩展名,我仍然会收到403错误。但是......在URL的末尾添加斜杠会完全绕过安全性。不是我们想要的。

因此,为了真正实现实际的URL模式安全性,我们必须实现这两种模式?这不太理想,因为我们有超过75个URL安全规则,并且重复它们并使它们保持同步将是困难的。是否有更好的方法来编写模式匹配,或者Spring的安全性本身是否已被破坏?

编辑:以下是我们的web.xml中的相关信息:

<servlet-mapping>
    <servlet-name>myproject</servlet-name>
    <url-pattern>/m/*</url-pattern>
</servlet-mapping>

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

2 个答案:

答案 0 :(得分:0)

切换到使用正则表达式表达您的网址,它为您提供了更大的灵活性,例如:

<sec:http auto-config="true" use-expressions="true" path-type="regex">
    <sec:intercept-url pattern="/m/partner/list.*" access="hasRole('VIEW_ADMIN_PARTNER_LIST')"/>
</sec:http>

注意/**已替换为.*,其在正则表达式世界中将匹配任何内容。

答案 1 :(得分:-1)

Spring安全性默认使用Ant模式。您正在寻找的模式是

/m/partner/list*/**

这将匹配

  • /m/partner/list.html
  • /m/partner/list/c.html
  • /m/partner/list/c/d.html

下面是一段Java代码,可用于测试Ant模式(将ant.jar添加到类路径中)

import org.apache.tools.ant.types.selectors.SelectorUtils;
public class PatternTest {
    public static void main(String [] args) {
        System.out.println(SelectorUtils.matchPath("/a/b*/**", "/a/b"));
        System.out.println(SelectorUtils.matchPath("/a/b*/**", "/a/b.html"));
        System.out.println(SelectorUtils.matchPath("/a/b*/**", "/a/b/c.html"));
    }
}