【问题标题】:Spring's sec:intercept-url easily bypassed?Spring 的 sec:intercept-url 容易被绕过?
【发布时间】:2014-03-14 20:43:00
【问题描述】:

在我们的 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')"/>

效果很好!现在无论我在 url 末尾添加什么扩展名,我仍然会收到 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>

【问题讨论】:

  • 可以看到对应的web.xml配置吗?它可能有缺陷,这就是它行为不端的原因。
  • @anttix 刚刚将其添加到我的帖子中。
  • 那时我会声称您的配置中有其他规则在某些条件下优先于该行。
  • 使用 log4j.logger.org.springframework.security=DEBUG 启用调试输出,控制台查看匹配的规则。
  • 哦,另一个猜测。也许您的安全配置中有这样的一行? 如果是这种情况,所有模式都会变成正则表达式而不是 ant 匹配器,而 something/** 只会匹配 something、something/、something//// 等 @987654321 @

标签: java spring spring-mvc spring-security


【解决方案1】:

改用正则表达式来表达你的网址,它给你更多的灵活性,例如:

<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>

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

【讨论】:

  • @anttix - What's wrong with ant expressions for his use case? - 嗯,正如问题所暗示的那样,它们不起作用;)
  • 他正在尝试保护路径 /m/partner/list 是什么阻止了 ant 表达式的工作?除了“正则表达式很酷”的概念之外?
  • @anttix - 问题是“有没有更好的方法来编写模式匹配,或者 Spring 的安全性本身就被破坏了?” - 这正是我提供的答案。谁说正则表达式很酷?你有更好的答案吗?您在讨论中添加了什么?
  • @ike_lova 他的表达是正确的教科书示例,因此他必须忽略其他一些东西。告诉人们跳槽而不是找出问题所在并不是解决方案。
  • 看来这是我们必须切换到的,因为根据我对 ANT 匹配的理解,它不匹配给定模式之后的所有内容,特别是如果它是 @987654325 @.
【解决方案2】:

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

/m/partner/list*/**

这将匹配

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

下面是可用于测试 Ant 模式的 Java 代码的 sn-p(将 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"));
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 2021-08-15
    • 2019-11-04
    • 2023-03-10
    相关资源
    最近更新 更多