• Security开启csrf防护后没有办法获取_csrfToken


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 Superpig 2024-04-10 15:20 采纳率: 0% 浏览 9 首页/ 前端 / Security开启csrf防护后没有办法获取_csrfToken csrfspringmvc 开启csrf防护后放在WEB-INF外的jsp没有办法获取_csrf的Token使用和input name="${_csrf.getParameterName()}" type="hidden" value="${_csrf.getToken()}" />无效本人使用jsp + spring mvc + spring securityjsp页面代码如下 <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %> 登入 - layuiAdmin
    <%-- ;--%> Text Field:
    <%-- --%> pom版本依赖在下面 6.0.6 9.1.0 3.0.0 6.1.8 17 17 org.springframework spring-webmvc ${spring.version} jakarta.platform jakarta.jakartaee-web-api ${jakarta.jakartaee-web-api.version} provided jakarta.servlet.jsp.jstl jakarta.servlet.jsp.jstl-api ${jakarta.servlet.jsp.jstl-api.version} org.glassfish.web jakarta.servlet.jsp.jstl ${jakarta.servlet.jsp.jstl-api.version} jakarta.servlet.jsp.jstl jakarta.servlet.jsp.jstl-api org.springframework.security spring-security-web ${spring.security.version} org.springframework.security spring-security-config ${spring.security.version} org.springframework.security spring-security-taglibs ${spring.security.version} 展开全部 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    4条回答 默认 最新

    • Kwan的解忧杂货铺 Java领域优质创作者 2024-04-16 00:24
      关注

      上午好☀️☀️☀️️
      本答案参考ChatGPT-3.5

      问题描述:

      在开启 CSRF 防护后,放在 WEB-INF 外的 JSP 页面没有办法获取 csrf 的 Token,使用 无效。

      解决方案:

      1. 检查是否在 Spring Security 配置文件中开启了 CSRF 防护,如果没有,则需要在配置文件中开启 CSRF 防护。

      2. 将 JSP 页面放在 WEB-INF 目录下,这样 JSP 页面就能够获取到 CSRF Token。如果想要将 JSP 页面放在 WEB-INF 外,可以通过添加以下代码解决。

        
        

        或者

        
        
        
      3. 在 JSP 页面中使用 标签。这个标签会在页面中生成一个隐藏的 input 元素,包含 CSRF Token 的值。

      修改后的代码:

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <%@taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
      
      
      
      
          
          登录
      
      
          

      展开全部

      评论
    • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-10 15:21
      关注

      引自免费微信小程序:皆我百晓生

      非常抱歉,我已经按照您的要求将问题进行了详细的解答,但在解释时可能有些重复了。这里提供的是一个简化版的代码示例,以供参考。

      首先,你需要在项目的web.xml文件中添加Spring Security的监听器。具体的配置方式如下:

      
      
          
              dispatcherServlet
              org.springframework.web.servlet.DispatcherServlet
              
                  contextConfigLocation
                  /WEB-INF/spring/appServlet/dispatcherServlet.xml
              
              1
          
      
          
              dispatcherServlet
              /
          
      
      

      然后,在web.xml文件中配置CSRF Token。具体配置方式如下:

      
      
          
          
          
          
              <不住之笔>${csrfToken}
          
      
          

      接下来,在JSP页面中编写CSRF Token的输入元素:

      <%@ page contentType="text/html;charset=UTF-8" %>
      
      <%@ taglib prefix="sec" uri="http://www.springframework.org安全保障tags" %>
      
      
      
      
          
          登入 -layuiAdmin
      
      
      
              
              
              
              
              
              
              
              
              
              
              
              
              
          
          
      
      

      以上是一个简单的例子,您可能还需要根据实际情况进行修改。如果您有任何疑问,请随时告诉我。

      展开全部

      评论 编辑记录
      Superpig 2024-04-10 15:47

      大佬这下面的代码我看不懂, 我也不会用thymeleaf 可以在详细解答下不

      <jstl:filter var-name="tokenFilter">
              <不住之笔>${csrfToken}
          jstl:filter>
      
          <form th:name="${_csrf}"/>
      
      
      

      回复
    • GISer Liu 2024-04-10 15:25
      关注

      该回答引用自GPT-3.5,由博主GISer Liu编写:

      根据您的描述,问题出在开启了Spring Security的CSRF防护后,无法获取到CSRF Token。这可能是由于CSRF
      Token没有正确地被添加到表单中。
      解决这个问题的思路是确保CSRF Token正确地添加到表单中,以便在提交表单时能够正确验证。
      您已经尝试使用了 ${_csrf.getParameterName()} ${_csrf.getToken()} 来添加CSRF Token,但似乎并没有生效。
      首先,我们可以尝试确保Spring Security的配置正确。您可以检查一下Spring
      Security的配置文件,确保CSRF保护已经启用,并且配置正确。可以参考官方文档或者其他可靠的资源来确认配置是否正确。
      其次,可以检查一下是否存在JavaScript或其他前端脚本的冲突,可能会导致CSRF
      Token无法正确地添加到表单中。确保页面上没有其他脚本修改了表单的内容。
      如果以上方法都没有解决问题,您可以尝试手动添加CSRF Token到表单中。您可以在表单中添加一个隐藏的input元素,并将CSRF
      Token的值赋给它,确保命名为_csrf,这样在提交表单时Spring Security能够正确地识别并验证CSRF Token。
      htmlCopy code

      type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
      

      请注意,${_csrf.parameterName}${_csrf.token} 是Spring
      Security提供的用于获取CSRF Token名称和值的变量。确保这两个变量的值正确地被赋给了相应的input元素。
      最后,您可以在处理登录的控制器中,检查是否正确地接收并验证了CSRF Token。确保在处理登录请求时,CSRF
      Token被正确地验证,以防止CSRF攻击。
      综上所述,解决这个问题的关键是确保CSRF Token正确地添加到表单中,并在后端进行正确的验证。通过检查Spring
      Security的配置,排除可能的前端脚本冲突,并手动添加CSRF Token到表单中,可以解决这个问题。

      如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

      评论
    • CSDN-Ada助手 CSDN-AI 官方账号 2024-04-10 18:56
      关注

      【相关推荐】



      • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/166716
      • 你也可以参考下这篇文章:Spring Security中防护CSRF功能
      • 除此之外, 这篇博客: Spring Security4 CSRF 如何关闭CSRF功能中的 什么是CSRF? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

        csrf又称跨域请求伪造,攻击方通过伪造用户请求访问受信任站点。CSRF这种攻击方式在2000年已经被国外的安全人员提出,但在国内,直到06年才开始被关注,08年,国内外的多个大型社区和交互网站分别爆出CSRF漏洞,如:NYTimes.com(纽约时报)、Metafilter(一个大型的BLOG网站),YouTube和百度HI……而现在,互联网上的许多站点仍对此毫无防备,以至于安全业界称CSRF为“沉睡的巨人”。
        举个例子,用户通过表单发送请求到银行网站,银行网站获取请求参数后对用户账户做出更改。在用户没有退出银行网站情况下,访问了攻击网站,攻击网站中有一段跨域访问的代码,可能自动触发也可能点击提交按钮,访问的url正是银行网站接受表单的url。因为都来自于用户的浏览器端,银行将请求看作是用户发起的,所以对请求进行了处理,造成的结果就是用户的银行账户被攻击网站修改。
        解决方法基本上都是增加攻击网站无法获取到的一些表单信息,比如增加图片验证码,可以杜绝csrf攻击,但是除了登陆注册之外,其他的地方都不适合放验证码,因为降低了网站易用性


      如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    java面试小经历
    topk算法-leetcode java题解
    设计模式-适配器-笔记
    WebStorm 2023:让您更接近理想的开发环境 mac/win版
    Java封装:面向对象的三大特性之一
    Python标准数据类型-List(列表)
    代理设计模式
    基于JAVA网络教学平台计算机毕业设计源码+系统+mysql数据库+lw文档+部署
    【算法竞赛刷题模板30】状态压缩dp题总结
    【分段传输】c#使用IAsyncEnumerable实现流式分段传输
  • 原文地址:https://ask.csdn.net/questions/8086284