在Tomcat中设置CsrfPreventionFilter

时间:2017-10-22 15:48:15

标签: jsp tomcat csrf-protection

我正在尝试在Tomcat 8中设置内置的CsrfPreventionFilter。

我想我已经阅读了StackOverflow中关于这个主题的所有问题和答案,但我仍然无法解决我的问题。

我有home.jspreports.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>  

1 个答案:

答案 0 :(得分:6)

您需要从entryPoints移除js,css和图片路径,并设置CsrfPreventionFilter的过滤器映射,使其不包含它们。

原因是在tomcat中,nonceCache默认大小为5。在你的情况下,当你请求js,css时,tomcat生成一个新的nonce(因为它们在entryPoints中)并将它添加到缓存中,在5个这样的请求之后你的初始nonce(为home.jsp生成)被刷出nonceCache而且是no更长的有效。因此,当您使用该随机数发送合法请求时,您将获得403