假设有一个名为 的假设电子邮件站点email.com
和一个名为 的恶意站点evil.com
。email.com
使用 POST 请求发送电子邮件。
email.com
具有保存在其计算机上的会话 cookie 的用户访问evil.com
,evil.com
并向其发送 httpPOST
请求,email.com
从而发送诈骗电子邮件。据我了解,服务器会在不进行任何检查的情况下从用户帐户发送电子邮件,因为浏览器提供了带有请求的会话 cookie,并且预检检查不适用于POST
,即使 CORS 不共享响应from email.com
withevil.com
因为它Access-Control-Allow-Origin
不包含evil.com
它没关系,因为电子邮件已经发送。
我知道这可以通过使用例如 CSRF 令牌来防止,但是为什么不也只为POST
请求实施预检检查呢?
你声称
飞行前检查不适用于
POST
但这是不正确的:碰巧使用该方法的所谓简单请求POST
不会被预检,但非简单 POST
请求会被预检。
例如,以下脚本在任何 Web 源的上下文中运行,而不是https://google.com
触发 CORS 预检,因为根据Fetch 标准(包含事实上的 CORS 规范),X-Foo
它不是CORS 安全列表中的请求标头:
let opts = {
method: "POST",
headers: {
"X-Foo": "foo"
}
};
fetch("https://google.com", opts);
或者,查看Jake Archibald的CORS 游乐场的这个特定实例。
此外,CORS 预检从未打算作为针对 CSRF 的防御机制;这种信念是一种常见的误解。相反,preflight 的目的是保护在浏览器支持跨域请求出现之前的服务器。有关CORS 预检背后原理的更多详细信息,请参阅这个更完整的答案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句