为什么同源策略不阻止 POST 请求?

Why does the Same Origin Policy not block POST requests?

我了解 GET 和 POST 等跨源“简单”请求一直是允许的(但您无法查看响应),并且 PUT/DELETE 已被阻止,或者如果您的浏览器支持 CORS,则预检。

我知道允许发送 GET 请求是无害的,只要响应被阻止,因为 GET 请求 应该 是 safe/idempotent(如果不是,那是开发者的错,因为他们没有制作 API ReSTful).

我也从这个 中了解到,GET 和 POST 是用户发出的 typical/intentional 请求,例如,在 URL 文本框中输入内容或单击按钮到 post 表单。

但是为什么浏览器会允许使用 xhr 的跨源 POST 请求?

那么如果用户可以通过单击 post 表单的按钮来有意 POST 请求呢? 允许 javascript 发送 POST 请求是灾难的根源,加载的任何恶意页面都可能在幕后执行跨源 POST 请求。

为什么浏览器没有从一开始就阻止这种情况?

如果他们这样做了,那么现在 CORS 已经存在,POST 请求可以像 PUT/DELETE 一样进行预检,这样你就会减少 xsrf 攻击。

消除使用 POST 的能力会大大降低 Web 应用程序的功能,而不会显着提高安全性。

如果没有 POST,将无法请求另一个域修改数据。 (请记住,这是在 CORS 提供一种选择加入跨域请求的方法之前。)这消除了整个 类 有用的 Web 应用程序。 (或者,更有可能的是,网络应用程序会通过滥用 GET 来解决这个问题。)

而且您不会因为这种牺牲而在 return 中得到太多。任何可能受到跨域 XHR POST 危害的服务器都必须具备 CSRF 保护措施,以应对来自表单 POST 的跨域攻击。而这样的防御(比如要求 special token)对两者同样有效。