【发布时间】:2018-03-09 00:44:11
【问题描述】:
我一直在使用 PHP 进行自己的 CSRF 保护。根据我所读到的内容,我决定使用 cookie 来实现我的保护,但对于我的方法是否能够抵御 CSRF 攻击感到有点困惑。
所以我的方法如下:
用户发送登录请求
服务器检查是否设置了 CSRF 令牌,如果未设置,则创建一个并将其存储在其 Session 中并使用该令牌创建一个 Cookie
通过检查是否在 POST 请求中来验证 CSRF 令牌,如果不在则检查 $_COOKIE 中的令牌
如果令牌无效则发回消息...
我决定使用 cookie 来存储令牌,因为这适用于 Ajax 请求,而且我不必在每次使用 Ajax POST 时都包含它。
我感到困惑的是攻击者不能只是提出请求吗? POST 或 GET,因为 cookie 在那里,它只是随请求一起发送,因此是一个有效的请求,因为令牌每次都与浏览器一起发送?
【问题讨论】:
-
CodeReview 会更适合你,我相信。
-
浏览器将阻止跨站点请求,因此任何在 cookie 中具有有效 CSRF 令牌的请求通常来自浏览您自己的域的客户端(除非您在某些路由中启用了 CORS,在这种情况下您需要小心)。
-
stackoverflow.com/a/20518324/487813 是一本很好的读物
-
@apokryfos no ,浏览器一般不会阻止跨站请求。它们会阻止您希望取回数据的请求。
XMLHttpRequest使用 CORS。但是使用 JavaScript 提交的隐藏<form>仍然可以向外部域发送 POST 请求。并且此类请求将包括用户的所有 cookie。将 CSRF 存储在 Cookie 中就像没有 CSRF 令牌一样。 -
@apokryfos 涵盖此内容的相关部分是
[...]Simple cross-origin requests generated outside this specification (such as cross-origin form submissions using GET or POST or cross-origin GET requests resulting from script elements) typically include user credentials, so resources conforming to this specification must always be prepared to expect simple cross-origin requests with credentials.[...](4 Security Considerations)
标签: php ajax security csrf csrf-protection