为什么恶意站点在攻击前不能通过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 将无法访问该令牌。
我有两个问题:
- 以上描述是否正确?
- 如果是这样,为什么站点 A 不能首先告诉我的浏览器发送 GET 到 B,从中获取 CSRF 令牌响应,然后使用令牌现在将 POST 发送到 B?请注意,令牌将有效并关联到我的会话,因为 GET 还包含我所有的 B cookie。
谢谢!
正确。
由于浏览器的 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 是一个较小的问题。 :)
如果我理解正确,在 CSRF 攻击中,恶意网站 A 告诉我的浏览器向站点 B 发送请求。我的浏览器会自动在该请求中包含我的 B cookie。尽管 A 看不到那些 cookie,但如果我已经在 B 中进行了身份验证,请求将看起来合法,并且请求的任何操作都将成功执行.为避免这种情况,每次我访问包含表单的 B 页面时,我都会收到一个 CSRF 令牌。此令牌与我的会话关联,因此如果我将 POST 设为 B,我必须包含此类令牌;否则 B 拒绝我的请求。此方案的好处是 A 将无法访问该令牌。
我有两个问题:
- 以上描述是否正确?
- 如果是这样,为什么站点 A 不能首先告诉我的浏览器发送 GET 到 B,从中获取 CSRF 令牌响应,然后使用令牌现在将 POST 发送到 B?请注意,令牌将有效并关联到我的会话,因为 GET 还包含我所有的 B cookie。
谢谢!
正确。
由于浏览器的 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 是一个较小的问题。 :)