使用Ajax的CSRF令牌无效

时间:2017-09-13 21:52:29

标签: javascript ajax csrf

我使用纯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。

1 个答案:

答案 0 :(得分:1)

CSRF_Token是一个cookie,由您的Web框架/服务器发送并存储在浏览器中。通常在您执行时通过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 header的东西,允许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,而没有有效的Google会话。