2012-02-10 67 views
4

默认情况下,浏览器不允许跨站点AJAX请求。为什么跨域AJAX请求被标记为“安全风险”?

据我所知,一个不好设想的跨域请求可能是一个安全风险。如果我采用html或外部网站的javascript,并将其“呈现”到我的网站中,那就是一个问题。这个外部代码可以用于很多不好的事情 - 比如访问当前用户的会话数据。

但如果我只请求JSON或XML数据,我用一个正确的库来解析JSON(不只是使用eval)我怎么也想不到,这将是一个安全隐患。可能发生的更糟的是,来自该网站的内容无法正确呈现。

我错过了什么?简单地通过发送一些恶意数据来破坏读取json/xml的页面是否可能?

+2

'默认情况下,浏览器不允许跨站点requests.'这句话需要一点抛光。你在谈论XHR吗?你在说cookie吗?因为通常浏览器允许跨域请求:可以使用指向远程域的锚点或表单,并且当用户点击此链接时,跨域请求将毫无问题地执行。 – 2012-02-10 13:01:30

+1

可能的重复http://stackoverflow.com/q/9222822和http://stackoverflow.com/q/9169038 – Gumbo 2012-02-10 13:04:08

+0

@DarinDimitrov你是对的。我改变了这句话。 – kikito 2012-02-10 16:14:32

回答

12

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

例如:

  1. 爱丽丝访问她的银行和日志中
  2. 然后,她访问邪恶网站。
  3. 邪恶的网站使用JavaScript来使Alice的浏览器,以请求她的银行
  4. 她的银行与Alice的账户细节应答,并将其传递给JavaScript
  5. 中的JavaScript,然后将它们传递到恶魔网站
  6. 的控制器

简而言之,它可以防止攻击者从任何Alice拥有凭据的站点(以及防火墙之后的站点,例如Alice的企业Intranet)读取私人数据。

请注意,这不会阻止不依赖于能够从站点读取数据的攻击(CSRF),但是如果没有相同来源策略,标准防御对抗CSRF将很容易被破坏。

+0

你错了。这不受同源策略的保护。 – Gumbo 2012-02-10 13:02:56

+0

@Gumbo - 我发现了这个例子中的缺陷,并在您发表评论时进行编辑。 – Quentin 2012-02-10 13:08:09

+0

嗯。如果我正确理解这一点,那么您的意思是用户会话在浏览器中共享?我的印象是服务器能够区分不同的打开的窗口/标签。 “嘿,这个请求来自不同的窗口,返回未经授权的响应代码” - 种类。情况并非如此吗? – kikito 2012-02-10 16:32:57

2

你与你的第二点重新JSON/XML绝对正确的。在采取适当的预防措施时,从另一个域接收JSON没有风险。即使服务器决定返回一些令人讨厌的脚本,您也可以通过适当的数据解析来有效地管理风险。事实上,这正是JSONP攻击如此受欢迎的原因(例如,请参阅twitter的搜索API)。

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

+0

这些是非常有趣的链接,谢谢! – kikito 2012-02-10 16:25:18

+0

我宁愿这种类型的事情的处理方式与浏览器请求访问您的麦克风,地理位置数据或网络摄像头的方式相同。只需在浏览器窗口顶部显示一个栏,询问example.com页面的权限即可访问data.example.com或mybank.com中的数据。如果您使用CORS或JSONP,那么栏不会出现。如果你不这样做,你会得到权限栏。 – TxRegex 2014-03-24 17:27:14