我正在尝试在Tomcat 8中设置内置的CsrfPreventionFilter。
我想我已经阅读了StackOverflow中关于这个主题的所有问题和答案,但我仍然无法解决我的问题。
我有home.jsp
和reports.jsp
home.jsp
的网址(一旦受到response.encodeUrl()
),就是
www.example.com/home.jsp?org.apache.catalina.filters.CSRF_NONCE=5E4BD8FEE1B4CC1DA79D874905015911
这是正确呈现的,不是因为nonce正在工作,而是因为我将home.jsp
设置为EntryPoint。但它似乎确实证明CSRFPreventionFilter已启动并正在运行并成功生成nonces。
如果我按CTRL + N然后输入www.example.com/reports.jsp
然后我添加相同的随机数,即www.example.com/reports.jsp?org.apache.catalina.filters.CSRF_NONCE=5E4BD8FEE1B4CC1DA79D874905015911
,那么我得到第403页。reports.jsp
未设置为EntryPoint ,但我希望它能成功渲染,因为它已经提供了一个随机数。
我做错了什么?
(我的问题有点类似于Getting 403 error when using CSRF filter with tomcat 6.0.32;但我觉得答案可能不是CSRFPrevention过滤器的设置方式,但可能是我处理响应/请求的方式有些问题内部,类似于@Pankaj Kumar在Not able to authenticate post request for CSRF token with tomcat)中的回答
更新
这是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>/images/404.JPG,/login.jsp,/home.jsp,/images/im_login.gif,/js/events.js,/js/menu.js,/js/amount_validation.js,/js/calendar.js,/js/toolbar.js,/js/tablesort.js,/js/scripts.js,/css/style.css</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CSRFPreventionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
答案 0 :(得分:6)
您需要从entryPoints
移除js,css和图片路径,并设置CsrfPreventionFilter
的过滤器映射,使其不包含它们。
原因是在tomcat中,nonceCache默认大小为5。在你的情况下,当你请求js,css时,tomcat生成一个新的nonce(因为它们在entryPoints中)并将它添加到缓存中,在5个这样的请求之后你的初始nonce(为home.jsp生成)被刷出nonceCache而且是no更长的有效。因此,当您使用该随机数发送合法请求时,您将获得403
。