I want to protect my WebApi endpoints against CSRF. Angular team recommends to use digest of your site's authentication cookie with a salt for added security. I'm not sure what's the advantage here comparing to random token. What is more, how do you protect login page?
Here is explanation why do you need to protect login page https://security.stackexchange.com/questions/2120/when-the-use-of-a-antiforgerytoken-is-not-required-needed
答案 0 :(得分:1)
您要描述的方法是detailed here:
跨站点请求伪造(XSRF)保护XSRF是一种技术 未经授权的网站可以获取用户的私人数据。角 提供了一种对抗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或每请求配置 对象
为了防止多个Angular环境中的碰撞 应用共享相同的域或子域,我们建议每个 应用程序使用唯一的cookie名称。
这似乎是Encrypted Token Pattern CSRF prevention method的变体,使用散列而不是加密,而盐就像密钥一样。
它还依赖于HTTP功能,可阻止自定义标头跨域发送,就像添加X-Requested-With
一样。
声明未经授权的网站的部分可以获取用户的私人数据"有点误导,因为CSRF不允许这样做 - CSRF攻击允许未经授权的网站在当前登录用户的上下文中提交您的网站表单。
此方法的一个优点是您不需要保存任何额外的服务器端。例如,如果您使用token-based身份验证,则可以通过对服务器端salt应用相同的哈希,轻松验证收到的CSRF令牌是否与cookie匹配。即使您使用基于cookie的身份验证,也不需要针对存储在服务器端的单独值验证CSRF令牌 - 您只需对cookie值进行散列以验证它是否与传递的令牌匹配。
请参阅this answer了解如何防止登录CSRF。