为什么恶意站点在攻击前不能通过GET获取CSRF token?

Why can't a malicious site obtain a CSRF token via GET before attacking?

如果我理解正确,在 CSRF 攻击中,恶意网站 A​​ 告诉我的浏览器向站点 B 发送请求。我的浏览器会自动在该请求中包含我的 B cookie。尽管 A​​ 看不到那些 cookie,但如果我已经在 B 中进行了身份验证,请求将看起来合法,并且请求的任何操作都将成功执行.为避免这种情况,每次我访问包含表单的 B 页面时,我都会收到一个 CSRF 令牌。此令牌与我的会话关联,因此如果我将 POST 设为 B,我必须包含此类令牌;否则 B 拒绝我的请求。此方案的好处是 A​​ 将无法访问该令牌。

我有两个问题:

谢谢!

正确。

由于浏览器的 CORS 策略,站点 A 无法获取站点 B 的 csrf 令牌。

并且我们需要验证请求的 referer(它可以被伪造)。 https://en.wikipedia.org/wiki/HTTP_referer

验证 url(也称为查询字符串)中的 crsf 令牌也是一个好习惯。

仅供参考,Laravel,一个流行的网络框架,在表单中使用隐藏的 CSRF 令牌字段来防止 csrf 攻击。

您的描述是正确的。

如果站点 A 告诉您的浏览器转到 B 并获取令牌,那很好,但是由于它是 cross-domain 请求,A 将无法访问 Javascript 中的令牌(这是一个浏览器功能)。因此,当 A 告诉您的浏览器返回 B 并实际执行某些操作时,它仍然无法在请求中包含令牌。

也就是说,除非B将token设置为cookie。显然,这是有缺陷的,因为令牌 cookie 也会被发送,从而否定任何保护。因此,在这种情况下,令牌必须作为表单值或请求 header(或其他不会像 cookie 一样自动发送的东西)发送。

这也意味着如果 B 容易受到 cross-site 脚本的攻击,它也容易受到 CSRF 的攻击,因为令牌可能会被盗,但 CSRF 是一个较小的问题。 :)