1) 用户在一个选项卡中登录 bank.com,所有内容均由 CSRF 令牌保护。然后他在另一个选项卡中打开 evil.com。
2) evil.com 中的 Javascript 可能会尝试向 bank.com/send_money 发出 POST 请求,前提是它知道 csrf_token。
3) 为了显示 csrf_token,evil.com 中的 javascript 可能会尝试对 bank.com/send_money 进行 GET ajax 调用,以获取与用户在浏览器中访问此页面所获得的完全相同的 html。然后读取令牌。
问题 - 为什么最后一步会失败并且总是会失败?
据我了解,bank.com 实际上会响应此请求并呈现所有 html,但在客户端,浏览器将决定来自另一个域的内容不应该被访问,因此它会失败。
如果 evil.com 中有 iframe 到 bank.com/send_money,iframe 将加载所有的 html 就好了,但是浏览器会再次决定这个 html 不能被 javascript 使用,它只能在 iframe 中查看。因此 JS 无法获取令牌,也无法发出 POST 请求。
这是正确的吗?这可以被愚弄吗?