【问题标题】:Send CSRF token inside javascript POST gives an Error在 javascript POST 中发送 CSRF 令牌会出现错误
【发布时间】:2014-05-03 02:31:18
【问题描述】:

在我的 Web 应用程序中,我使用的是 spring security 3.2.x,并且我正在进行 CSRF 验证。在我的登录页面中,我已成功完成此操作。但在里面,我有一个按钮,按钮操作是写在一个 javascript 中

        $('#download').click(function(){

            var paramValue = '${params}';
            var params = $('#params_').clone()
            $('<form target="_blank" action="report" method="post"></form>').append(params).appendTo('body').submit().remove();

        });

现在的问题是当我点击那个按钮时它给出了以下错误

在请求参数“_csrf”或标头“X-CSRF-TOKEN”上发现无效的 CSRF 令牌“null”。

我认为这是因为它发送 CSRF 令牌失败。谁能告诉我如何解决这个问题。

提前致谢

【问题讨论】:

    标签: javascript spring spring-security csrf csrf-protection


    【解决方案1】:

    是的,正如您所说,这是因为您动态创建的表单不包含有效的 CSRF 令牌输入。来自Spring Security documentation

    $(function () {
      var token = $("meta[name='_csrf']").attr("content");
      var header = $("meta[name='_csrf_header']").attr("content");
      $(document).ajaxSend(function(e, xhr, options) {
        xhr.setRequestHeader(header, token);
      });
    });
    

    这将为您的 ajax 请求添加所需的标头。

    【讨论】:

    • 您在 ajax 请求标头中看到此标头吗?
    • 找到了答案。检查我给出的答案
    • 你是对的。这不是 ajax 请求,不知道为什么我看不到。
    【解决方案2】:

    好的,我的问题在于下一行我没有像在正常的表单提交中那样发送 csrf 令牌。

            $('<form target="_blank" action="report" method="post"></form>').append(params).appendTo('body').submit().remove();
    

    所以我所做的是我创建了隐藏字段并像下面这样插入它。

    <script type="text/javascript">
    
        $(document).ready(function () {
        $('#download').click(function(){                
    
                var params = $('#params_').clone();
                var csrftoken = $("#csrftoken_").clone();
                $('<form target="_blank" action="report" method="post"></form>')
                    .append(params)
                    .append(csrftoken)
                    .appendTo('body')
                    .submit()
                    .remove();
    
            });
        });
    </script>
    
      <input type='hidden' id='params_' name='params' value='${params}' />
      <input type="hidden" id="csrftoken_" name="${_csrf.parameterName}" value="${_csrf.token}" /> 
    

    这行得通....

    【讨论】:

      猜你喜欢
      • 2015-03-26
      • 1970-01-01
      • 2018-03-20
      • 2021-07-08
      • 2021-06-16
      • 2018-07-01
      • 1970-01-01
      • 2018-08-27
      • 2018-08-19
      相关资源
      最近更新 更多