为啥不总是预检 POST 请求?

Posted

技术标签:

【中文标题】为啥不总是预检 POST 请求?【英文标题】:Why aren't POST requests always preflighted?为什么不总是预检 POST 请求? 【发布时间】:2015-09-05 09:42:22 【问题描述】:

根据MDN,如果Content-Type 是application/x-www-form-urlencodedmultipart/form-datatext/plain 中的任何一个,则不会预检POST 请求。

但是multipart/form-data 不是和application/xml 一样不安全吗?例如,无论端点接受的内容类型如何,我都希望始终禁止对 url http://bank.com/money-orders/ 的跨域 POST 请求。

【问题讨论】:

另见CORS - What is the motivation behind introducing preflight requests? 【参考方案1】:

因为:在 CORS 被构想出来之前,就可以发送跨域 POST 请求,例如,一个来源的网页将用户在页面上填写表单的结果发送到另一个来源在一个来源并单击 提交 按钮将其发送到另一个来源。

因此,基本上,CORS 不会改变这种行为——它不会阻止或禁止它,因为在 CORS 出现之前它已经成为可能并被允许。

不过,那时还没有办法在这样的 POST 请求中发送自定义标头。但是 CORS 使这成为可能——发出一种服务器以前从未见过或不得不处理的新请求。因此,预检的目的基本上是对服务器说,这是一种新类型的 POST(或 GET),您必须表明您正在选择加入并且可以使用(或新方法)。

但是,如果 POST 请求与在 Web 上基本上一直允许的简单 POST 请求没有任何不同,则不需要向服务器发出警告。

【讨论】:

以上是关于为啥不总是预检 POST 请求?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Postman 和 Fiddler 从不生成预检请求

为啥在预检请求后 Chrome 不在开发工具网络选项卡上显示 POST 请求?

为啥 CORS 中没有针对具有标准内容类型的 POST 请求的预检

由于 CORS 选项预检,ReactJS 无法发送 POST 请求

为啥 Firefox 并不总是为 POST 请求发送 HTTP Origin 标头?

CORS:为啥我的浏览器不发送 OPTIONS 预检请求?