跨域表单POST

时间:2012-07-10 23:54:45

标签: html security http csrf same-origin-policy

我在这个主题上看过各地的文章和帖子(包括SO),而流行的评论是同源政策阻止了跨域的表单POST。我见过的唯一一个人认为同源政策不适用于表格帖子,is here

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

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

  1. 如果Chrome,IE或Firefox允许域名“Y”的内容向域名“X”发送POST
  2. 如果接收POST的服务器实际上会看到任何表单值。我这样说是因为大多数在线讨论记录测试人员说服务器收到了帖子,但表单值都是空的/被删除。
  3. 什么样的官方文档(即RFC)解释了预期的行为(无论浏览器当前实现了什么)。
  4. 顺便提一下,如果同源不会影响表单POST,那么它会更清楚地说明为什么需要使用防伪令牌。我说“有些”因为似乎很容易相信攻击者可以简单地发出HTTP GET来检索包含防伪令牌的表单,然后进行包含相同令牌的非法POST。评论

3 个答案:

答案 0 :(得分:152)

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

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

并且在发布表单时没有涉及javascript,因此相同的原始策略不适用。

有关详细信息,请参阅wikipedia

答案 1 :(得分:39)

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

构建CSRF漏洞的方法有很多种。 A simple POST based CSRF attack可以使用.submit()方法发送。更复杂的攻击,例如cross-site file upload CSRF attacks,将利用CORS use of the xhr.withCredentals behavior

CSRF没有违反Same-Origin Policy For JavaScrip t,因为SOP涉及JavaScript 读取 服务器对客户端请求的响应。 CSRF攻击不关心响应,它们关心副作用,或者请求产生的状态更改,例如添加管理用户或在服务器上执行任意代码。

确保使用OWASP CSRF Prevention Cheat Sheet中描述的方法之一保护您的请求。有关CSRF的更多信息,请参阅OWASP page on CSRF

答案 2 :(得分:14)

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

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

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

一个很好的例子:here

来自Mozilla的好文档:here