2017-09-13 66 views
0

我使用纯粹的JavaScript来访问使用Spring构建的某些Web服务。当我试图对使用CSRF时遇到的问题之一使用Ajax Post调用。使用Ajax的无效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

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实际访问你的网站,并试图POST数据到它之前创建一个有效的会话。 google.com上的用户不能发布到stackoverflow.com,除非stackoverflow.com设置了一个叫做cors头的东西,它允许Google.com和Stackoverflow.com之间的通信通过。

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

+0

谢谢你的解释。我真正需要知道的是这两件事,即服务器期望的名称和实际的令牌。我一直在做进一步的研究,显然,Spring,默认情况下会使这个令牌对客户端不可见。因此,看起来如果你不使用他们的技术(JSP),你将需要禁用它。 – Tony