Superpig 2024-04-10 15:20 采纳率: 0%
浏览 15

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

开启csrf防护后放在WEB-INF外的jsp没有办法获取_csrf的Token
使用<sec:csrfInput />和
input name="${_csrf.getParameterName()}" type="hidden" value="${_csrf.getToken()}" />无效
本人使用jsp + spring mvc + spring security
jsp页面代码如下

<%@ page  contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>

<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>



<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>登入 - layuiAdmin</title>
</head>
<body>

        <form action="${pageContext.request.contextPath }/do/login.html" method="post">
      
<%--        <input name="${_csrf.getParameterName()}" type="hidden" value="${_csrf.getToken()}" />;--%>
            <sec:csrfInput />
            Text Field:<br />
            <%--        <input type="hidden" id="csrfTokenInput" name="_csrf">--%>
            <input type="text" name="loginAcct" aria-label="用户名" placeholder="用户名">
            <input type="text" name="userPswd" aria-label="密码" placeholder="密码">

        <input type="submit" >
        </form>



</body>
</html>


pom版本依赖在下面

<properties>
        <spring.version>6.0.6</spring.version>
        <jakarta.jakartaee-web-api.version>9.1.0</jakarta.jakartaee-web-api.version>
        <jakarta.servlet.jsp.jstl-api.version>3.0.0</jakarta.servlet.jsp.jstl-api.version>
        <spring.security.version>6.1.8</spring.security.version>



        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>jakarta.platform</groupId>
            <artifactId>jakarta.jakartaee-web-api</artifactId>
            <version>${jakarta.jakartaee-web-api.version}</version>
            <scope>provided</scope>
        </dependency>

        <!-- jsp需要依赖! jstl-->
        <dependency>
            <groupId>jakarta.servlet.jsp.jstl</groupId>
            <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
            <version>${jakarta.servlet.jsp.jstl-api.version}</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.web</groupId>
            <artifactId>jakarta.servlet.jsp.jstl</artifactId>
            <version>${jakarta.servlet.jsp.jstl-api.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>jakarta.servlet.jsp.jstl</groupId>
                    <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>


        <!-- SpringSecurity对Web应用进行权限管理 -->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>${spring.security.version}</version>
<!--            <version>6.0.2</version>-->
        </dependency>

        <!-- SpringSecurity配置 -->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>${spring.security.version}</version>

            <!--            <version>6.0.2</version>-->
<!--            <version>6.0.8</version>-->
        </dependency>

        <!-- SpringSecurity标签库 -->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-taglibs</artifactId>
            <version>${spring.security.version}</version>

            <!--            <version>6.0.2</version>-->
        </dependency>



    </dependencies>


  • 写回答

5条回答 默认 最新

  • 关注

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

    问题描述:

    在开启 CSRF 防护后,放在 WEB-INF 外的 JSP 页面没有办法获取 csrf 的 Token,使用 <sec:csrfInput /><input name="${_csrf.getParameterName()}" type="hidden" value="${_csrf.getToken()}" /> 无效。

    解决方案:

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

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

      <sec:csrfMetaTags/>
      

      或者

      <meta name="_csrf" content="${_csrf.token}">
      <meta name="_csrf_parameter_name" content="${_csrf.parameterName}">
      
    3. 在 JSP 页面中使用 <sec:csrfInput/> 标签。这个标签会在页面中生成一个隐藏的 input 元素,包含 CSRF Token 的值。

    修改后的代码:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
    
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>登录</title>
    </head>
    <body>
        <form action="${pageContext.request.contextPath}/do/login.html" method="post">
            <sec:csrfInput/> <!-- 生成隐藏的 input 元素,包含 CSRF Token 的值 -->
            <input type="text" name="loginAcct" aria-label="用户名" placeholder="用户名">
            <input type="text" name="userPswd" aria-label="密码" placeholder="密码">
            <input type="submit" value="登录">
        </form>
    </body>
    </html>
    
    评论

报告相同问题?

问题事件

  • 修改了问题 4月12日
  • 创建了问题 4月10日

悬赏问题

  • ¥15 如何让子窗口鼠标滚动独立,不要传递消息给主窗口
  • ¥15 如何能达到用ping0.cc检测成这样?如图
  • ¥15 关于#DMA固件#的问题,请各位专家解答!
  • ¥15 matlab生成的x1图不趋于稳定,之后的图像是稳定的水平线
  • ¥15 请问华为OD岗位的内部职业发展通道都有哪些,以及各个级别晋升的要求
  • ¥20 微信小程序 canvas 问题
  • ¥15 系统 24h2 专业工作站版,浏览文件夹的图库,视频,图片之类的怎样删除?
  • ¥15 怎么把512还原为520格式
  • ¥15 MATLAB的动态模态分解出现错误,以CFX非定常模拟结果为快照
  • ¥15 求高通平台Softsim调试经验