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 也是允许的。
现在你所做的是
- 您已将
appNameRemoved/login.jsp
作为入口点,您不需要这样做,因为它在 /appNameRemoved/folder1/*
urls. 之外,无论如何都可以访问
- 也许您正在使用
response.encodeURL("/appNameRemoved/folder1/delete")
的 main.jsp
也在 /appNameRemoved/folder1/*
之外。 CSRF 声明只会在应用 CSRFPreventionFilter
的资源中生成。如果您的 main.jsp
被放置在文件夹 /appNameRemoved/folder1/
中,正确的 CSRF 随机数将被添加到编码的 url 中。同样在这种情况下,要使 main.jsp
可访问,您需要在 init prams 中将其设置为 entryPoint
像这样
<init-param>
<param-name>entryPoints</param-name>
<param-value>appNameRemoved/folder1/main.jsp</param-value>
</init-param>
我有一个在 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 也是允许的。
现在你所做的是
- 您已将
appNameRemoved/login.jsp
作为入口点,您不需要这样做,因为它在/appNameRemoved/folder1/*
urls. 之外,无论如何都可以访问
- 也许您正在使用
response.encodeURL("/appNameRemoved/folder1/delete")
的main.jsp
也在/appNameRemoved/folder1/*
之外。 CSRF 声明只会在应用CSRFPreventionFilter
的资源中生成。如果您的main.jsp
被放置在文件夹/appNameRemoved/folder1/
中,正确的 CSRF 随机数将被添加到编码的 url 中。同样在这种情况下,要使main.jsp
可访问,您需要在 init prams 中将其设置为 entryPoint
像这样
<init-param>
<param-name>entryPoints</param-name>
<param-value>appNameRemoved/folder1/main.jsp</param-value>
</init-param>