【问题标题】:Tomcat 8.5 anti-CSRF nonce not being generated未生成 Tomcat 8.5 反 CSRF 随机数
【发布时间】:2018-07-10 20:50:42
【问题描述】:

我有一个在 Tomcat 8.5 上运行的 Web 应用程序。我想更新应用程序以依赖 Tomcat 的本机反 CSRF 令牌来保护 Web 应用程序上的关键 POST 请求。我已经做了很多研究并遵循了一些示例,但我似乎仍然无法让它发挥作用。

web.xml:

<filter>
    <filter-name>CSRFPreventionFilter</filter-name>
    <filter-class> org.apache.catalina.filters.CsrfPreventionFilter </filter-class>
    <init-param>
        <param-name>entryPoints</param-name>
        <param-value>appNameRemoved/login.jsp</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>CSRFPreventionFilter</filter-name>
    <url-pattern>/appNameRemoved/folder1/*</url-pattern>
</filter-mapping>

所以从表面上看,这似乎有效。任何访问 folder1 内的 URL 的尝试都会被 403(好)拒绝。当我尝试生成 nonce 值以允许授权方访问特权区域时,就会出现问题。

在我的 main.jsp(登录入口点 login.jsp 后打开的 JSP)中,我有以下 Java 代码来尝试生成 nonce 值:

String antiCSRF = response.encodeURL("/appNameRemoved/folder1/delete");

问题是,生成的值很简单

"/appNameRemoved/folder1/delete" 

而不是预期的 URL(如其他人的示例所见),例如:

"/appNameRemoved/folder1/delete?org.apache.catalina.filters.CSRF_NONCE=CB5C65E1D87A39D5557D6BCBC24E54A9"

因此我的问题是,为什么 response.encodeURL() 实际上没有使用 nonce 值对 URL 进行编码,即使据我所见,过滤器已正确设置并在访问特权 URL 时检查 nonce。

谢谢!

【问题讨论】:

    标签: java tomcat csrf csrf-protection nonce


    【解决方案1】:

    您似乎将main.jsp(您在其中使用response.encodeURL())保留在文件夹/appNameRemoved/folder1/ 之外。

    通过使用

    <filter-mapping>
        <filter-name>CSRFPreventionFilter</filter-name>
        <url-pattern>/appNameRemoved/folder1/*</url-pattern>
    </filter-mapping>
    

    您正在将CSRFPreventionFilter 应用于网址/appNameRemoved/folder1/*。即所有带有 /appNameRemoved/folder1/* 模式的 url 都将受到 CSRF nonce 的保护。

    通过申请

    <init-param>
       <param-name>entryPoints</param-name>
       <param-value>url1, url2</param-value>
    </init-param>
    

    你是说 tomcat 在/appNameRemoved/folder1/* 中,即使没有 CSRF nonce,url1 和 url2 也是允许的。

    现在你所做的是

    1. 您已将 appNameRemoved/login.jsp 作为入口点,您不需要这样做,因为它在 /appNameRemoved/folder1/* 网址之外仍然可以访问。
    2. 也许您在其中使用response.encodeURL("/appNameRemoved/folder1/delete")main.jsp 也在/appNameRemoved/folder1/* 之外。 CSRF 通告只会在应用了CSRFPreventionFilter 的资源中生成。如果您的 main.jsp 被放置在文件夹 /appNameRemoved/folder1/ 中,则正确的 CSRF 随机数将被添加到编码的 url。同样在这种情况下,要使 main.jsp 可访问,您需要在 init 婴儿车中将其设置为 entryPoint

    这样

    <init-param>
       <param-name>entryPoints</param-name>
       <param-value>appNameRemoved/folder1/main.jsp</param-value>
    </init-param>
    

    【讨论】:

    • @dFrancisco - 欢迎!很高兴看到它确实有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2021-04-12
    • 2016-04-25
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    相关资源
    最近更新 更多