【发布时间】: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