【问题标题】:Cross-domain Ajax form submit - How to avoid XSS / CRSF while allowing on any domain?跨域 Ajax 表单提交 - 如何在允许任何域的同时避免 XSS / CRSF?
【发布时间】:2014-02-21 19:07:48
【问题描述】:

我工作的公司有一个表单,可以通过一行 Javascript 将其添加到任何网站。例如:

<script type="text/javascript" src="//ourserver.com/form.js?id=12345" />

在我们的服务器端,这由 mod_rewrite 获取并发送到 PHP 文件,该文件生成表单代码(基于 id)并使用 HTML 代码执行 document.write,并包含要处理的 jQuery Ajax 代码表单提交。

当然,浏览器和服务器并不是跨域 Ajax 的忠实拥护者,但我们通过添加标头使其工作:

header('access-control-allow-origin: *');

到我们服务器上的表单处理脚本 (PHP)。但是,从我一直在阅读的内容来看,这(以及一般的跨域发布)可能会引发很多 XSS / CSRF 漏洞利用问题。

所以,我的问题是,我们应该如何设置 javascript 和 PHP / 服务器来帮助防止这些漏洞,同时仍然允许将 javascript 放在任何域上?

我们不能将allow-origin标头限制到特定域,我尝试在生成表单时设置会话令牌,然后在提交表单时检查它,但是由于表单的实现方式,会话不会继续。

【问题讨论】:

  • header是否只添加到处理AJAX表单提交的页面?
  • 是的,“access-control-allow-origin”标头仅在处理来自 AJAX 表单提交的 POST 的 process.php 文件中。
  • 表单提交后 AJAX 处理程序返回哪些数据(如果有)?
  • 它是 JSON,它要么是 success:'true',要么是 err:'An error message'(例如未输入必填字段,或处理数据时出错)。没有返回用户输入的数据。

标签: php ajax forms xss csrf


【解决方案1】:

当您使用 Access-Control-Allow-Origin: * 标头时,我假设提交表单的用户不使用 cookie 身份验证,因为使用通配符 Access-Control-Allow-Origin 无法进行凭据请求。

这意味着您不必担心CSRF 攻击,因为表单无法在其他用户的上下文中自动提交。

CSRF 通常发生在用户登录网站时。例如www.foo.com 然后他们访问另一个站点(例如www.evil.com)而不退出www.foo.com。假设www.evil.com 在页面中包含一个图像请求。

例如

&lt;img src="https://www.foo.com/DeleteAccount" /&gt;

由于用户已登录www.foo.com,因此该请求发送了身份验证 cookie,并删除了用户的帐户。但是,由于您没有使用身份验证 cookie,因此不可能进行这样的攻击。

此外,由于您没有从服务器返回任何敏感信息,因此允许 Access-Control-Allow-Origin 标头中的任何域应该没问题,只要它仅用于 AJAX POST 的处理程序。如果您在 AJAX JSON 响应中返回任何错误消息,请确保它不包含有关您的服务器的任何机密数据。这将是一个information leakage 漏洞,与CSRFXSS 是分开的。

转到XSS 然后...根据您的描述,在您的情况下,XSS 没有比普通网站额外的风险。第三方站点信任您的站点通过在其页面上包含&lt;script&gt; 标记来在其域的上下文中执行脚本,而不是相反。您只需确保将任何输出正确编码到 .js 文件或 JSON 响应中。 JS 编码是您在这两种情况下都需要的转义(不是 HTML 编码)。在OWASP XSS Prevention Cheat Sheet 中查看Rule #3

您的会话方法不起作用的原因是您没有在响应中包含Access-Control-Allow-Credentials: true,因此cookie 不会与POST 一起发送。如果您想使用它,则必须更改 Access-Control-Allow-Origin 标头以反映请求中的 Origin 标头(因为凭据请求不允许使用 * 通配符)。

【讨论】:

  • 太好了,感谢您对我的问题的详细解释、链接和答案。
猜你喜欢
  • 1970-01-01
  • 2017-01-24
  • 2013-12-29
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
  • 2016-03-03
  • 2015-10-11
  • 1970-01-01
相关资源
最近更新 更多