我在理解以下代码时遇到了一些麻烦
run.$inject = ['$http'];
function run($http) {
$http.defaults.xsrfHeaderName = 'X-CSRFToken';
$http.defaults.xsrfCookieName = 'csrftoken';
}
因为我一直以为csrf被注入html表单或ajax调用而不是cookie,因为csrf可以防止任何试图使用你的cookie进行身份验证的对手。
有人可以详细解释角度处理csrf的方式以及它如何从后端获取令牌?
答案 0 :(得分:0)
我不能比angular docs更好地回答这个问题,所以我只想引用:
跨站点请求伪造(XSRF)保护
XSRF是一种未经授权的网站可以获取用户私人数据的技术。 Angular提供了一种对抗XSRF的机制。执行XHR时 请求,$ http服务从cookie中读取令牌(默认情况下, XSRF-TOKEN)并将其设置为HTTP标头(X-XSRF-TOKEN)。仅限 在您的域上运行的JavaScript可以读取cookie,即您的服务器 可以放心,XHR来自运行在你身上的JavaScript 域。不会为跨域请求设置标头。
要利用这一点,您的服务器需要在一个令牌中设置一个令牌 在第一个HTTP上称为XSRF-TOKEN的JavaScript可读会话cookie GET请求。在随后的XHR请求中,服务器可以验证 cookie匹配X-XSRF-TOKEN HTTP标头,因此请确保 只有您域上运行的JavaScript才能发送请求。 对于每个用户,令牌必须是唯一的,并且必须由 服务器(防止JavaScript编写自己的令牌)。我们 建议令牌是您网站身份验证的摘要 带有盐的饼干,以增加安全性。
可以使用xsrfHeaderName和指定标题的名称 $ httpProvider.defaults的xsrfCookieName属性 config-time,运行时$ http.defaults或每请求配置 对象
$http.defaults.xsrfCookieName
只允许您指定Cookie的名称,否则它将查找默认的XSRF-TOKEN
。
在服务器端实现中,我建议使用一些node.js中间件来处理初始cookie的设置,而不是自己滚动。特别注意csurf,因为它似乎是最受欢迎的。您还可以尝试使用senchalab的csrf中间件。这些都应该足以让你开始。