You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

为什么跨源简单POST请求不会触发CORS预检检查?

为什么跨源简单POST请求不会触发预检检查?

嘿,这个问题问到点子上了!要搞懂这个,得从CORS的设计逻辑和Web历史兼容性两方面来看:

首先得明确:CORS里的预检请求(OPTIONS方法),本质是浏览器帮你提前“踩点”,确认目标服务器是否允许当前跨域请求的额外权限。但简单请求是浏览器判定为「要么安全风险极低,要么是Web早期就存在的传统行为」的请求类型,所以不需要多这一步预检。

根据相关文档的定义:

不会触发CORS预检的请求被称为“简单请求”……允许的方法仅包括:

  • GET
  • HEAD
  • POST
    ……Content-Type头的允许值仅包括:
  • application/x-www-form-urlencoded
  • multipart/form-data
  • text/plain

那为什么POST的这几种Content-Type能被归为简单请求呢?
答案是历史兼容性:早在上世纪90年代,HTML表单就支持跨域提交数据了——比如早年的第三方支付跳转、跨站论坛登录,都是靠这种方式实现的。浏览器一直默认允许这种行为,如果突然给这类请求加上预检,会导致大量旧网站的传统功能直接失效,这显然是不合理的。

再说说你提到的那个诱骗场景:用户访问evilsite.com后被诱导提交表单到elsewhere.com,这其实就是浏览器原生允许的跨域表单提交行为,完全符合简单请求的规则。不过别担心,这里有个关键的安全限制:这种跨域表单提交后,浏览器是不允许JavaScript读取返回的响应内容的,只能触发页面跳转——这就避免了恶意站点通过这种方式窃取目标站的敏感数据。

内容的提问来源于stack exchange,提问作者Afs35mm

火山引擎 最新活动