【问题标题】:How does angularjs handle csrf?angularjs如何处理csrf?
【发布时间】:2015-06-18 08:10:24
【问题描述】:

我在理解下面的代码时有点麻烦

run.$inject = ['$http'];

function run($http) {
  $http.defaults.xsrfHeaderName = 'X-CSRFToken';
  $http.defaults.xsrfCookieName = 'csrftoken';
}

因为我一直认为 csrf 被注入到 html 表单或 ajax 调用而不是 cookie,因为 csrf 可以防止任何对手试图使用您的 cookie 进行身份验证。

有人可以详细解释一下 angular 如何处理 csrf 以及它如何从后端获取令牌?

【问题讨论】:

  • 我相信你上面的代码应该放在config块而不是run块中
  • 我不确定,但我在tutorial找到了代码
  • 没关系,但它应该在配置块内..而不是运行块
  • 对不起,如果这是一个菜鸟问题,但为什么它应该在配置块内?
  • 配置相关设置应始终在config 块内完成,因为它是所有框架都遵循的标准模式

标签: javascript angularjs security csrf


【解决方案1】:

我无法比angular docs 自己更好地回答这个问题,所以我只引用:

跨站请求伪造 (XSRF) 保护

XSRF 是一种技术,未经授权的网站可以通过该技术获取您用户的私人数据。 Angular 提供了一种机制来对抗 XSRF。执行 XHR 时 请求时,$http 服务从 cookie 中读取一个令牌(默认情况下, XSRF-TOKEN) 并将其设置为 HTTP 标头 (X-XSRF-TOKEN)。由于只有 在您的域上运行的 JavaScript 可以读取 cookie、您的服务器 可以确定 XHR 来自运行在您的 领域。跨域请求不会设置header。

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

可以使用 xsrfHeaderName 和 $httpProvider.defaults 的 xsrfCookieName 属性位于 config-time, $http.defaults at run-time, or per-request config 对象。

$http.defaults.xsrfCookieName 只是允许您指定 cookie 的名称,否则它将寻找默认的 XSRF-TOKEN

在服务器端实现上,我建议使用一些 node.js 中间件来处理初始 cookie 的设置,而不是自己滚动。看看csurf,因为它似乎是最受欢迎的。你也可以试试 senchalab 的 csrf 中间件。其中任何一个都应该足以让您入门。

【讨论】:

  • 你能举个例子吗?在 django 或 nodejs 上?
  • @Kevin 您是否尝试过我添加到答案中的那些 node.js 中间件?
  • 我做了,但无法让中间件正常工作,我需要自己做更多研究
  • @Mordred 请提供一个例子。如果你能提供我使用中间件节点 js anf 字体使用 angular js 的示例,我需要我的应用程序。
猜你喜欢
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 2013-12-06
  • 2015-12-14
  • 2018-07-17
  • 2017-04-16
  • 1970-01-01
相关资源
最近更新 更多