我的日常

登录/注册
您现在的位置:论坛 资料库 JAVA开发 > spring security 4 request parameter '_csrf' or head ...
总共48087条微博

动态微博

查看: 5072|回复: 0

spring security 4 request parameter '_csrf' or header 'X-CSRF-TOKEN'.

[复制链接]
admin    

1244

主题

544

听众

1万

金钱

管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    跳转到指定楼层
    楼主
    发表于 2016-07-22 13:37:53 |只看该作者 |倒序浏览
    最近配置 spring security 4  登陆,感觉终于配置好了,居然出现HTTP Status 403 - Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'.
    原来spring security4增加了csrf, 而且默认是启用的,所以如果你是auto-config="true",那么就已经启用了csrf,
    在http节点中可以对其进行配置
    1. <security:csrf/>
    复制代码


    所以意味着页面提交的信息中需要包含csrf的token, 如果是从spring security3签约过来很容易在这里被绊倒
    请求的验证匹配规则,官网是这样的

    The RequestMatcher instance to be used to determine if CSRF should be applied. Default is any HTTP method except "GET", "TRACE", "HEAD", "OPTIONS"
    所以对post,put, 一定跳不过

    csrf过滤器验证两项内容,报文头:Request Headers  ;  提交数据:Form Data

    实现代码

    login.jsp



    1. <%@ taglib prefix='security' uri='http://www.springframework.org/security/tags' %>
    2. ....

    3. <form action="login" class="login-form" method="post" style="display: inline-table;">
    4.         。。。
    5.    <security:csrfInput/>
    6.    <button type="submit" class="btn btn-success btn-block">登 录</button>
    7. </form>
    复制代码

    这里使用了security的一个标签,实际会生成

    1. <input type="hidden" name="_csrf" value="XXXXXXXXXXXXXXXXXXXX">
    复制代码
    如果非表单提交会就会遇到麻烦,不可能为每次提交都加这么一个隐藏域
    可以在报文头增加crsf的token,已jQuery为例

    首先修改页面

    1. <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
    2. <%@ taglib prefix='security' uri='http://www.springframework.org/security/tags' %>
    3. <!DOCTYPE html>
    4. <html lang="zh">
    5.   <head>
    6.     <meta charset="utf-8">
    7.     <title>首页</title>
    8.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
    9.     <security:csrfMetaTags/>
    10. 。。。。。。
    复制代码

    这个标签会生成

    1.     <meta name="_csrf_parameter" content="_csrf" />
    2.     <meta name="_csrf_header" content="X-CSRF-TOKEN" />
    3.     <meta name="_csrf" content="XXXXXXXXXXXXXXXXXX" />
    复制代码

    然后写一个统一的jquery提交的处理

    1. (function(){
    2.         $(document).ajaxSend(function(e,xhr,opt) {
    3.                 if (opt.type == "POST"){
    4.                         var header = $('meta[name=_csrf_header]').attr('content');
    5.                         var token  = $('meta[name=_csrf]').attr('content');
    6.                         if (header != '' && token != ''){                       
    7.                                 xhr.setRequestHeader(header, token);
    8.                         }
    9.                 }
    10.         });
    11. })();
    复制代码





    科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、科帮网管理员和版主有权不事先通知发贴者而删除本文


    JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

    快速回复
    您需要登录后才可以回帖 登录 | 立即注册

       

    关闭

    站长推荐上一条 /1 下一条

    发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
    快速回复 返回顶部 返回列表