Tomcat 8.5 反 CSRF 随机数未生成

Tomcat 8.5 anti-CSRF nonce not being generated

我有一个在 Tomcat 8.5 上运行的 Web 应用程序。我想更新应用程序以依赖 Tomcat 的原生反 CSRF 令牌来保护网络应用程序上的关键 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(JSP 在入口点 login.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 进行编码,即使据我所知,过滤器设置正确并检查 nonce 的时间访问特权URL。

谢谢!

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

通过使用

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

您正在将 CSRFPreventionFilter 应用于 urls /appNameRemoved/folder1/*。即所有具有模式 /appNameRemoved/folder1/* 的 url 都将受到 CSRF 随机数的保护。

通过应用

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

你是说 tomcat 即使没有 CSRF 随机数,/appNameRemoved/folder1/*、url1 和 url2 也是允许的。

现在你所做的是

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

像这样

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