【发布时间】:2017-03-07 09:56:50
【问题描述】:
我是网站安全的新手,目前正试图深入了解 Same-Origin-Policy。 虽然在 stackoverflow 和其他地方有关于 SOP 概念的非常好的帖子,但我找不到关于 chrome 和其他浏览器是否允许跨域 XHR 发布请求'发送更新信息/strong>' 从一开始就是这样。
从this 5 岁的帖子来看,chrome 似乎允许请求传递到请求的服务器,但不允许读取请求者的响应。
我在我的网站上进行了测试,试图从不同的域更改我服务器上的用户信息。详情如下:
- 我的域:“www.mysite.com”
- 攻击者域:“www.attacker.mysite.com” 根据 Same-Origin-Policy,这两个被认为是不同的起源。
用户(登录到 www.mysite.com 时)打开 www.attacker.mysite.com 并按下一个按钮,向“www.mysite.com”服务器发出 POST 请求...提交的隐藏表单(在这种情况下没有令牌)具有更改“www.mysite.com”服务器上的用户信息所需的所有信息 --> 结果:CSRF 成功攻击:用户信息确实发生了变化。
现在做同样的事情,但使用 javascript 通过 JQuery
.post提交表单而不是提交表单--> 结果:除了 chrome 给出正常响应:
请求中没有“Access-Control-Allow-Origin”标头 资源
,我发现服务器端没有做任何更改......似乎请求甚至没有从浏览器通过。用户信息根本没有改变!虽然这听起来不错,但我的预期正好相反。
根据我的理解和上面链接的帖子,对于跨域请求,只有服务器响应应该被浏览器阻止而不是从一开始就向服务器发送帖子请求。
另外,我没有任何 CORS 配置集;没有发送Access-Control-Allow-Origin headers。但即使我有那个设置,它也应该只适用于“读取”服务器响应而不是实际发送请求......对吗?
我想到了预检,发送请求以检查服务器是否允许它,从而在发送实际数据以更改用户信息之前阻止请求。但是,根据 Access_Control_CORS ,这些预检仅在不适用于我的简单 AJAX 发布请求的特定情况下发送(其中包括一个简单的表单,默认情况下为 application/x-www-form-urlencoded 并且不发送自定义标头)。
那么,是不是 chrome 已经改变了它的安全规范,从一开始就阻止了对跨域的 post 请求? 还是我对同源策略的理解在这里遗漏了什么?
无论哪种方式,了解是否有在不同网络浏览器中实施的更新安全措施的来源会很有帮助。
【问题讨论】:
-
Buy 攻击者只能使用表单帖子,为什么还要使用 XHR 来妨碍自己?
-
是的...我只是在探索 SOP 的限制以及它的行为方式。
-
我刚刚观察到这一点,正要在 SO 上提出这个问题,但偶然发现了这篇文章。
标签: ajax security post csrf same-origin-policy