动态脚本标记的安全问题

时间:2009-03-27 19:57:29

标签: javascript security json

这个flickr blog post讨论了他们对人员选择器自动完成的最新改进背后的想法。

他们必须克服的一个问题是如何在客户端解析和处理如此多的数据(即所有联系人)。他们尝试通过AJAX获取XML和JSON,但发现它太慢了。然后,他们通过动态生成的脚本标记(带回调函数)来说明加载数据:

  

JSON和动态脚本标记:快速但不安全

     

使用大的理论   字符串操作是问题所在   用最后一种方法,我们切换了   从使用Ajax到取而代之   使用动态生成的数据   脚本标记。这意味着   联系人数据从未被视为   字符串,而是执行为   就像下载一样   任何其他JavaScript文件。该   性能差异是   令人震惊:89毫秒解析10,000   联系人(减少3个订单   大小),而最小的情况   172个联系人只用了6ms。解析   每次接触的时间实际上减少   列表越大。这个   方法看起来很完美,除了   一件事:为了这个JSON   被执行,我们必须把它包装成一个   回调方法。 因为它是可执行的   代码,世界上任何网站都可以   使用相同的方法下载a   Flickr成员的联系人列表。这是   交易破坏者。 (强调我的)

有人可以在这里考虑确切的安全风险(可能有样本利用)吗?如何通过脚本标记中的“src”属性加载给定文件,而不是通过AJAX调用加载该文件?

3 个答案:

答案 0 :(得分:8)

这是一个很好的问题,这种漏洞曾经被用来窃取gmail中的联系人列表。

每当浏览器从域中获取数据时,它都会发送该站点设置的任何cookie数据。然后,此cookie数据可用于对用户进行身份验证,并获取任何特定的用户数据。

例如,当您加载新的stackoverflow.com页面时,您的浏览器会将您的cookie数据发送到stackoverflow.com。 Stackoverflow使用该数据来确定您的身份,并为您显示适当的数据。

从域加载的任何其他内容也是如此,包括CSS和Javascript文件。

Flickr面临的安全漏洞是任何网站都可以嵌入Flickr服务器上托管的这个javascript文件。然后,您的Flickr cookie数据将作为请求的一部分发送(因为javascript托管在flickr.com上),Flickr将生成包含敏感数据的javascript文档。然后,恶意站点将能够访问已加载的数据。

以下是用于窃取谷歌联系人的漏洞利用程序,这可能比上面的解释更清晰: http://blogs.zdnet.com/Google/?p=434

答案 1 :(得分:5)

如果我要在我的网站上放置一个HTML页面:

<script src="http://www.flickr.com/contacts.js"></script>
<script> // send the contact data to my server with AJAX </script>

假设contacts.js使用会话知道要发送的联系人,我现在会有一份你的联系人副本。

但是,如果通过JSON发送联系人,我无法从我的HTML页面请求它们,因为它将是一个跨域AJAX请求,这是不允许的。我也无法从我的服务器请求该页面,因为我没有您的会话ID。

答案 2 :(得分:0)

用简单的英语:

在人们的计算机上运行的未经授权的计算机代码(Javascript)不允许从运行它的站点以外的任何地方获取数据 - 浏览器有义务强制执行此规则。

对代码的来源没有相应的限制,因此如果您在代码中嵌入数据,则用户访问的任何网站都可以使用用户的凭据来获取用户的数据。