【发布时间】:2019-11-13 15:40:03
【问题描述】:
在我看来,CSRF 的主要目标是确认发出请求的客户是我们期望的客户。
我常见的解决方法是:
- 服务器随机生成 CSRF Token
- 服务器在 cookie 中设置 CSRF 令牌
- 服务器在生成表单时将 CSRF 令牌注入到表单中 或
- 服务器将 CSRF 令牌传递给 javascript,然后 javascript 将 CSRF 令牌作为 XMLHTTPRequests 上的标头注入
- 收到请求后,会通过检查 cookie 中的 CSRF 令牌与标头/表单值中的 CSRF 令牌是否匹配来验证请求。
服务器正在为 (3)(1) 生成 CSRF 对我来说很有意义,但我想不出为什么需要 (3)(2) 的原因。
相反,如果客户端是纯javascript,我相信这是安全的:
- Javascript 生成随机 CSRF 令牌
- Javascript 在 cookie 中设置 CSRF 令牌
- Javascript 在发出 XMLHTTPRequest 时在标头中传递 CSRF 令牌
- 服务器检查标头和 cookie 中的 CSRF 令牌是否匹配
我的理解是 3 和 4 都是攻击者不能做的事情,所以这也足以阻止攻击。对吗?
如果那个是安全的,我们还需要执行步骤(1)和(2)吗?由于同源策略(假设 cors 配置正确),这是否也是安全的?
- Javascript 在 XMLHTTPRequest 中设置一个 'CSRF-Safe: true' 标头
- 服务器检查标头 CSRF-Safe 是否存在并设置为“true”
【问题讨论】:
-
为什么你认为攻击者不能做 1 到 4 甚至更多?大多数攻击者甚至不会使用您的代码,并且会制作适合漏洞的请求,在您的情况下,只需将标头和 cookie 设置为某个随机值以绕过检查。
-
@LawrenceCherone,但如果他们这样做了,他们不能生成已知代码并将其用于(1)和(2)
-
@LawrenceCherone 我也有独特的会话 cookie 来授权请求。当客户端是浏览器时,我相信 CSRF 只是为了验证客户端。据我所知,移动应用程序代码不需要进行 CSRF 检查。
-
@LawrenceCherone,我想我的问题让我意识到我们在同一页上。我只是在处理您关于 (1) 和 (2) 的未经编辑的评论。
-
CSRF 是为了防止登录用户通过 mitm replay 或一些已经通过的 xss 代码对他们的知识进行一些操作。
标签: javascript security csrf websecurity