【问题标题】:Using digest of your site's authentication cookie for CSRF为 CSRF 使用您网站的身份验证 cookie 的摘要
【发布时间】:2016-02-13 17:51:56
【问题描述】:

我想保护我的 WebApi 端点免受 CSRF 的影响。 Angular 团队建议使用您网站的身份验证 cookie 的摘要和盐以增加安全性。我不确定与随机令牌相比有什么优势。还有,如何保护登录页面?

这里解释了为什么你需要保护登录页面https://security.stackexchange.com/questions/2120/when-the-use-of-a-antiforgerytoken-is-not-required-needed

【问题讨论】:

    标签: javascript c# angularjs asp.net-web-api csrf


    【解决方案1】:

    你描述的方法是detailed here

    跨站请求伪造 (XSRF) 保护 XSRF 是一种技术 未经授权的网站可以获取您用户的私人数据。角 提供了一种对抗 XSRF 的机制。在执行 XHR 请求时, $http 服务从 cookie 中读取令牌(默认为 XSRF-TOKEN) 并将其设置为 HTTP 标头 (X-XSRF-TOKEN)。由于只有 JavaScript 在您的域上运行的可以读取 cookie,您的服务器可以是 确保 XHR 来自在您的域上运行的 JavaScript。这 跨域请求不会设置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 对象。

    为了防止在多个 Angular 的环境中发生冲突 应用程序共享相同的域或子域,我们建议每个 应用程序使用唯一的 cookie 名称。

    这似乎是Encrypted Token Pattern CSRF prevention method 的变体,使用散列而不是加密,并且盐的作用类似于密钥。

    它还依赖于防止自定义标头跨域发送的 HTTP 功能,就像添加 X-Requested-With 一样。

    声明“未经授权的站点可以获取您用户的私人数据”的部分有点误导,因为 CSRF 不允许直接这样做 - CSRF 攻击允许未经授权的站点在当前登录的上下文中提交您站点的表单用户。

    这种方法的一个优点是您不需要在服务器端保存任何额外的东西。例如,如果您使用token-based 身份验证,您可以通过对服务器端盐应用相同的哈希来轻松验证收到的 CSRF 令牌是否与 cookie 匹配。即使您使用基于 cookie 的身份验证,您也无需针对存储在服务器端的单独值验证 CSRF 令牌 - 您只需对 cookie 值进行哈希处理以验证它是否与传递的令牌匹配。

    请参阅this answer,了解如何防止登录 CSRF。

    【讨论】:

    • 我不明白为什么 hash(cookie + salt) 比随机字符串好。如果有人可以访问 cookie,你就完蛋了gist.github.com/lukasz-madon/53a4a89a738ffb7c85e7
    • CSRF 是一种与提供 cookie 访问权限的攻击向量完全不同的攻击向量。如果后者是一个问题,那么在修复这个假设的高风险漏洞之前,您不应该为 csrf 失眠。它不一定“更好”,但具有不需要服务器端状态的优点。
    猜你喜欢
    • 2013-08-29
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多