Tomcat 7和CSRF过滤器

 布尔熊 发布于 2023-01-01 12:22

我正在尝试将CS​​RF保护添加到java Web应用程序中.我有web.xml配置了CSRF过滤器和过滤器到servlet的映射.但是,我不知道下一部分该怎么做.文档说,返回给客户端的所有URL都是通过调用HttpServletResponse #creditRedirectURL(String)或HttpServletResponse #creditURL(String)来编码的.他们还说你可以尝试:或者可以将nonce作为带有名称org的请求参数传回. apache.catalina.filters.CSRF_NONCE,它是常量org.apache.catalina.filters.Constants.CSRF_NONCE_REQUEST_PARAM的值.

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


    CSRF
    org.apache.catalina.filters.CsrfPreventionFilter
    
      entryPoints
      /html,/html/
    
  

  
    CSRF
    exampleservlet
  

这是JSP页面代码

"> ">

我究竟做错了什么?

1 个回答
  • 我认为这个问题现在已经不再重要,因为这个问题是在几年前提出的,但我偶尔会访问它以获得一些使用的提示org.apache.catalina.filters.CsrfPreventionFilter.正如tomcat官方网站CSRF_Prevention_Filter上的文档所述,CsrfPreventionFilter假设这被映射到"/*",并使用init-param命名的"entryPoints"来保存URL

    提供一种在导航远离它后导航回受保护应用程序的方法

    我将尝试以CsrfPreventionFilter简单的方式解释所完成的工作:

      首先,当客户端访问应用程序时,请求的URL必须由过滤器映射并匹配其中一个entryPoints.所以这CsrfPreventionFilter可能会产生一个新的随机数,并存储到会话包装的响应压倒一切的 HttpServletResponse#encodeRedirectURL(String)HttpServletResponse#encodeURL(String),而不会阻塞请求(通过返回403) .

      HttpServletResponse#encodeRedirectURL(String) or HttpServletResponse#encodeURL(String)正如您在表单操作中所做的那样,页面中的URL应该由编码.事实上,"编码"是在第一步中附加请求参数名称"org.apache.catalina.filters.CSRF_NONCE",其值为filter生成的nonce.

      当客户端访问页面中编码的URL时,CsrfPreventionFilter会检查请求是否有效 - nonce是否匹配当前会话中存储的那些(使用大小为5的LRUCache默认值,可以通过init-param设置nonceCacheSize).

    因此,除非exampleservlet您声明的servlet 也映射到"/*"或" /html,/html/",并且/ html可能导致页面保存表单,否则您的代码将无效.

    因为您使用的响应

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

    没有被包裹,CsrfPreventionFilter并且不会做魔法来附加nonce.

    不是

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

    会成功,因为过滤器从未设置过会话属性"org.apache.catalina.filters.CSRF_NONCE".即使有一个,它仍然拥有一个LRUCache实例,但不是一个nonce字符串.

    2023-01-01 12:25 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有