【问题标题】:Invalid CSRF Token using Ajax使用 Ajax 的 CSRF 令牌无效
【发布时间】:2018-02-22 17:53:35
【问题描述】:

我使用纯 javascript 来访问某些使用 Spring 构建的 Web 服务。当我尝试对其中一项服务使用 Ajax Post 调用时,我遇到了 CSRF 问题。

Ajax 调用是以下几行:

var data = {'attribute1':'1','attribute2':'2'};

$.ajax({
    type: "POST",
    url: url,
    data: data,
    success: function(data)
    {   
        if (typeof inputId !== 'undefined') {
            $("#"+inputId).val(JSON.stringify(data));
        }
        console.log(JSON.stringify(data));    
    }
  });

我一直在网上搜索,但我发现的只是更新后端(JSP、PHP)以填充表单中的属性“${_csrf.parameterName}”。 但是,我没有使用任何后端,所有页面都是 HTML 和 javascript。

【问题讨论】:

    标签: javascript ajax csrf


    【解决方案1】:

    CSRF_Token 是由您的 Web 框架/服务器向下发送并存储在浏览器中的 cookie。通常,当您通过 ajax 调用发布时...您需要将该 CSRF_Token 值作为 JSON 数据的一部分发送。为此...您需要使用 JavaScript 查找 cookie 名称并获取值。比您需要将值分配给服务器期望看到的正确变量名。例如,

    var data = { crsf_token_name_server_expects: csrf_token_value_I_obtained };
    

    CSRF_Token 用于确保与您的 api 通信的人在尝试向其发布数据之前实际访问了您的站点并创建了一个有效的会话。 google.com 上的用户无法发布到 stackoverflow.com,除非 stackoverflow.com 设置了一个称为 cors 标头的东西,它允许 Google.com 和 Stackoverflow.com 之间的通信通过。

    根据您的问题...您说您要发布到由 Java Spring 提供支持的后端 api。这个 api 需要一个 csrf_token,所以听起来它是一个只应该用于设置此服务的域名的 api。例如,用户访问 google.com 并向 www.google.com/url_to_post_to/ 进行 POST。 Google 将确保随此请求发送 CSRF_Token...因为他们不希望人们只是随机访问此 api url...而没有有效的 Google 会话。

    【讨论】:

    • 感谢您的解释。我真正需要知道的是这两件事,服务器期望的名称和实际的令牌。我一直在做进一步的研究,显然,Spring 默认情况下会使这个令牌对客户端不可见。因此,看来如果您不使用他们的技术(JSP),您将需要禁用它。
    猜你喜欢
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 2017-07-15
    • 1970-01-01
    • 2018-05-12
    • 2019-09-05
    相关资源
    最近更新 更多