为什么跨域AJAX请求被标记为“安全风险”?

时间:2012-02-10 12:57:00

标签: javascript ajax json cross-domain xss

默认情况下,浏览器不允许跨站点AJAX请求。

据我所知,一个设想不当的跨域请求可能存在安全风险。如果我使用外部网站的html或javascript并将其“渲染”到我的网站中,那就是一个问题。该外部代码可用于许多不良事情 - 例如访问当前用户的会话数据。

但是,如果我只请求JSON或XML数据,并且我使用适当的库来解析JSON(不仅仅是使用eval),我无法想象这将是一个安全风险。更糟糕的是,来自该网站的内容无法正确呈现。

我错过了什么吗?是否可以通过发送某种恶意数据来破坏读取json / xml的页面?

2 个答案:

答案 0 :(得分:12)

风险不是发出请求的网站。

例如:

  1. Alice访问她的银行并登录。
  2. 然后她访问了Evil Site。
  3. Evil Site使用JavaScript导致Alice的浏览器向Her Bank提出请求
  4. Her Bank用Alice的帐户详细信息回复并将其传递给JavaScript
  5. JavaScript然后将它们传递给Evil Site的控制器
  6. 简而言之 - 它可以防止攻击者从Alice拥有凭据的任何站点(以及防火墙后面的站点,例如Alice的企业Intranet)读取私有数据。

    请注意,这不会阻止不依赖于从网站(CSRF)读取数据的攻击,但如果没有同源策略,对CSRF的标准防御很容易被破坏。 / p>

答案 1 :(得分:2)

你的第二点是JSON / XML,这是完全正确的。如果采取适当的预防措施,则从其他域接收JSON没有风险。即使服务器决定返回一些讨厌的脚本,您也可以通过适当的数据解析来有效地管理风险。事实上,这正是JSONP hack如此受欢迎的原因(例如,参见twitter的搜索API)。

我们已经看到支持HTML5的浏览器为跨域通信引入了新的对象和标准(postMessage - http://dev.w3.org/html5/postmsg/和跨源资源共享 - http://www.w3.org/TR/cors/)。