Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 在POST请求中验证CSRF令牌_Angularjs_Javascript Framework - Fatal编程技术网

Angularjs 在POST请求中验证CSRF令牌

Angularjs 在POST请求中验证CSRF令牌,angularjs,javascript-framework,Angularjs,Javascript Framework,我将AngularJS与Rails一起使用。我有以下批量更新用户的请求 $http{ method: 'POST', url: $scope.update_url, params: {selected_ids: userIds} } 由于URL长度的限制,这不能是“GET”请求(http://support.microsoft.com/kb/208427) 但是对于“POST”请求,我们需要在头中有一个CSRF真实性令牌 如何将CSRF令牌设置为post请求头?您可

我将AngularJS与Rails一起使用。我有以下批量更新用户的请求

 $http{
    method: 'POST',
    url: $scope.update_url,
    params: {selected_ids: userIds}
 }
由于URL长度的限制,这不能是“GET”请求(http://support.microsoft.com/kb/208427)

但是对于“POST”请求,我们需要在头中有一个CSRF真实性令牌


如何将CSRF令牌设置为post请求头?

您可以按照服务中的说明设置http头

您可以在全球范围内进行设置:

$httpProvider.defaults.headers.post['My-Header']='value'   (or)
$http.defaults.headers.post['My-Header']='value';
或对于单个请求:

$http({
   headers: {
      'My-Header': 'value'
   }  
});
以下是一段重要的引语:

跨站点请求伪造(XSRF)保护XSRF是由 未经授权的站点可以获取用户的私有数据。有棱角的 提供以下机制来对抗XSRF。执行XHR时 请求时,$http服务从名为 XSRF-TOKEN并将其设置为HTTP头X-XSRF-TOKEN。只因为 在您的域上运行的JavaScript可以读取cookie,即您的服务器 可以肯定的是,XHR来自于在您的计算机上运行的JavaScript 域名

要利用这一点,服务器需要在 在第一个HTTP GET上名为XSRF-TOKEN的JavaScript可读会话cookie 要求在后续的非GET请求中,服务器可以验证 cookie与X-XSRF-TOKEN HTTP头匹配,因此请确保 只有在您的域上运行的JavaScript才能读取令牌。这个 令牌对于每个用户都必须是唯一的,并且必须可由 服务器(防止JavaScript生成自己的令牌)。我们 建议令牌是站点身份验证的摘要 加盐的饼干,增加安全性


如果您想知道如何在Rails中实际设置XSRF-TOKEN cookie值,那么这个答案有一个实现

我最近遇到了同样的问题,添加gem解决了这个问题。据我所知,它为每个rails控制器创建了一个带有rails CSRF-TOKEN的cookie,该cookie将被$http捕获(默认$http行为)

谢谢阿斯哥特!这是设置CSRF令牌的post请求的正确方式吗?或者我应该创建一个隐藏表单并在ng-click()上提交带有StudentID的表单吗?但在这种情况下,我如何获得响应数据?再次感谢!我已经添加了angular本身的一句话。我不清楚为什么这个解决方案与angular的文档一致。文档说明您需要设置cookie,但您似乎是在手动设置标头。@asgoth我不确定这是如何计数器CSRF的。我认为CSRF是有效的,因为从另一个浏览器页面调用同一个域会重新发送与该域关联的cookie。如果我们将令牌放在cookie中,那么该检查不会变得无用吗?@RevNoah顶部的代码示例是如何在$http服务上设置头的通用示例。如果设置了cookie标记,则将自动设置标头。