首页 > 解决方案 > 为什么同源策略不阻止 POST 请求?

问题描述

我了解始终允许跨域、“简单”请求,例如 GET 和 POST(但您无法查看响应),并且如果您的浏览器支持 CORS,则 PUT/DELETE 会被阻止或预检。

我知道,只要响应被阻止,允许发送 GET 请求是无害的,因为 GET 请求应该是安全/幂等的(如果不是,那是开发人员没有使他们的 API ReSTful 的错)。

我也从这个答案中了解到,GET 和 POST 是用户发出的典型/有意请求,例如在 URL 文本框中输入内容或单击按钮发布表单时。

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

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

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

如果他们这样做了,那么现在 CORS 已经存在,POST 请求可以像 PUT/DELETE 一样进行预检,并且您会遇到更少的 xsrf 攻击。

标签: httpcorscsrfsame-origin-policy

解决方案


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

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

而你不会因为这种牺牲而得到太多回报。任何可能受到跨域 XHR 损害的服务器POST都必须有 CSRF 保护来处理来自表单的跨域攻击POST。而这样的防御(比如需要一个特殊的令牌)对两者同样有效。


推荐阅读