171

我已经看过关于这个主题的所有文章和帖子(包括 SO),流行的评论是同源策略阻止跨域的表单 POST。我看到有人建议同源政策不适用于表单帖子的唯一地方是这里

我想从更“官方”或正式的来源获得答案。例如,有没有人知道 RFC 解决了同源如何影响或不影响表单 POST?

澄清:我不是在问是否可以构造 GET 或 POST 并将其发送到任何域。我在问:

  1. 如果 Chrome、IE 或 Firefox 允许来自域“Y”的内容向域“X”发送 POST
  2. 如果接收 POST 的服务器实际上会看到任何表单值。我这样说是因为大多数在线讨论记录测试人员说服务器收到了帖子,但表单值都是空的/被剥离了。
  3. 什么官方文档(即 RFC)解释了预期的行为是什么(不管浏览器当前实现了什么)。

顺便说一句,如果同源不影响表单 POST - 那么它就更清楚地说明了为什么需要防伪令牌。我说“有点”,因为似乎太容易相信攻击者可以简单地发出 HTTP GET 来检索包含防伪令牌的表单,然后发出包含相同令牌的非法 POST。评论?

4

3 回答 3

194

同源策略仅适用于浏览器端编程语言。因此,如果您尝试使用 JavaScript 发布到与原始服务器不同的服务器,那么相同的原始策略就会发挥作用,但如果您直接从表单发布,即操作指向不同的服务器,例如:

<form action="http://someotherserver.com">

并且发布表单时不涉及javascript,则不适用同源政策。

有关更多信息,请参阅维基百科

于 2012-07-11T03:14:17.670 回答
48

可以构建任意 GET 或 POST 请求并将其发送到受害者浏览器可访问的任何服务器。这包括本地网络上的设备,例如打印机和路由器。

构建 CSRF 漏洞利用的方法有很多。 可以使用方法发送一个简单的基于 POST 的 CSRF 攻击.submit()。更复杂的攻击,例如跨站点文件上传 CSRF 攻击将利用CORS 使用 xhr.withCredentals 行为

CSRF 不违反JavaScrip t 的同源策略,因为 SOP 涉及 JavaScript读取服务器对客户端请求的响应。CSRF 攻击不关心响应,他们关心请求产生的副作用或状态变化,例如添加管理用户或在服务器上执行任意代码。

确保使用OWASP CSRF 预防备忘单中描述的方法之一保护您的请求。有关 CSRF 的更多信息,请参阅 CSRF上的 OWASP 页面

于 2012-07-11T00:08:43.210 回答
18

同源策略与将请求发送到另一个 url(不同的协议或域或端口)无关。

这完全是关于限制从另一个 url 访问(读取)响应数据。因此,页面中的 JavaScript 代码可以发布到任意域或将该页面中的表单提交到任何地方(除非表单位于具有不同 url 的 iframe 中)。

但是使这些 POST 请求效率低下的原因是这些请求缺少防伪令牌,因此被其他 url 忽略。此外,如果 JavaScript 尝试通过向受害者 url 发送 AJAX 请求来获取该安全令牌,则同源策略会阻止它访问该数据。

一个很好的例子:这里

还有一份来自 Mozilla 的优秀文档:这里

于 2015-05-07T23:09:59.303 回答