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

问题描述

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

我了解,只要响应被阻止,允许发送GET请求都是无害的,因为GET请求应该 是安全的/幂等的(如果不是,那是开发人员的错误所在他们的API更新)。

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

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

那么,如果用户可以通过单击发布表单的按钮发出有意的POST请求,该怎么办? 允许javascript发送POST请求是灾难的秘诀,任何加载的恶意页面都可以在后台执行跨源POST请求。

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

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

解决方法

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

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

您将不会为此牺牲很多。任何可能受到跨域XHR POST损害的服务器,都必须已经具有CSRF保护,以应对来自POST形式的跨域攻击。这样的防御措施(例如要求使用special token)对两者都同样有效。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...