gpt4 book ai didi

Tomcat 7 和 CSRF 过滤器

转载 作者:行者123 更新时间:2023-11-28 21:49:15 45 4
gpt4 key购买 nike

我正在尝试为 Java Web 应用程序添加 CSRF 保护。我为 web.xml 配置了 CSRF 过滤器和到 servlet 的过滤器映射。但是,我不确定接下来该怎么做。文档说返回给客户端的所有 URL 都通过调用 HttpServletResponse#encodeRedirectURL(String) 或 HttpServletResponse#encodeURL(String) 进行编码他们还说你可以试试:或者可以将随机数作为请求参数传回,名称为 org.apache.catalina.filters.CSRF_NONCE,这是常量 org.apache.catalina.filters.Constants.CSRF_NONCE_REQUEST_PARAM 的值。

更新我仍然被 403 禁止。有人有什么建议吗?这是 web.xml 设置:

<filter>
<filter-name>CSRF</filter-name>
<filter-class>org.apache.catalina.filters.CsrfPreventionFilter</filter-class>
<init-param>
<param-name>entryPoints</param-name>
<param-value>/html,/html/</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>CSRF</filter-name>
<servlet-name>exampleservlet</servlet-name>
</filter-mapping>

这是JSP页面代码

<FORM METHOD="POST"  ACTION="<%=response.encodeURL("/exampleservlet")%>">
<INPUT TYPE="HIDDEN" NAME="org.apache.catalina.filters.CSRF_NONCE" VALUE="<%=session.getAttribute("org.apache.catalina.filters.CSRF_NONCE")%>">
<INPUT TYPE="HIDDEN" NAME="id" VALUE="0">

我做错了什么?

最佳答案

我认为这个问题现在已经不重要了,因为这个问题是几年前提出的,但我偶尔会访问它以获取有关使用 org.apache.catalina.filters.CsrfPreventionFilter 的一些提示。 .如tomcat官方网站的文档所述CSRF_Prevention_Filter , 这个CsrfPreventionFilter假定映射到“/*”,并使用 init-param命名为“entryPoints”以保存

的 URL

provide a way to navigate back to a protected application after having navigated away from it

我将尝试解释 CsrfPreventionFilter 所做的工作以一种简单的方式:

  1. 首先,当客户端访问应用程序时,请求的 URL 必须由过滤器映射并匹配 entryPoints 之一。 .这样CsrfPreventionFilter可以生成新的随机数存储到 session 中包装响应覆盖HttpServletResponse#encodeRedirectURL(String)HttpServletResponse#encodeURL(String) ,同时不阻止请求(通过返回 403)
  2. 页面中的 URL 应编码为 HttpServletResponse#encodeRedirectURL(String) or HttpServletResponse#encodeURL(String) ,就像您在表单操作中所做的那样。其实,“编码”就是在请求参数名“org.apache.catalina.filters.CSRF_NONCE”上加上第一步filter生成的nonce值。
  3. 当客户端访问页面中经过编码的URL时,CsrfPreventionFilter将检查请求是否有效——随机数是否匹配当前 session 中存储的随机数之一(使用默认大小为 5 的 LRUCache,可以通过初始化参数 nonceCacheSize 设置)。

所以,除非 servlet exampleservlet您声明还映射到“/*”或“/html,/html/”,并且/html 可能导致页面包含表单,您的代码将无法工作。

因为你在

中使用的响应

<FORM METHOD="POST" ACTION="<%=response.encodeURL("/exampleservlet")%>">

未被 CsrfPreventionFilter 包裹并且不会施展魔法来附加随机数。

都不是

<INPUT TYPE="HIDDEN" NAME="org.apache.catalina.filters.CSRF_NONCE" VALUE="<%=session.getAttribute("org.apache.catalina.filters.CSRF_NONCE")%>">

会成功,因为过滤器从未设置过 session 属性“org.apache.catalina.filters.CSRF_NONCE”。即使有一个,它也包含一个 LRUCache 实例而不是一个 nonce 字符串。

关于Tomcat 7 和 CSRF 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24942501/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com