这个flickr blog post讨论了他们对人员选择器自动完成的最新改进背后的想法。
他们必须克服的一个问题是如何在客户端解析和处理如此多的数据(即所有联系人)。他们尝试通过AJAX获取XML和JSON,但发现它太慢了。然后,他们通过动态生成的脚本标记(带回调函数)来说明加载数据:
JSON和动态脚本标记:快速但不安全
使用大的理论 字符串操作是问题所在 用最后一种方法,我们切换了 从使用Ajax到取而代之 使用动态生成的数据 脚本标记。这意味着 联系人数据从未被视为 字符串,而是执行为 就像下载一样 任何其他JavaScript文件。该 性能差异是 令人震惊:89毫秒解析10,000 联系人(减少3个订单 大小),而最小的情况 172个联系人只用了6ms。解析 每次接触的时间实际上减少 列表越大。这个 方法看起来很完美,除了 一件事:为了这个JSON 被执行,我们必须把它包装成一个 回调方法。 因为它是可执行的 代码,世界上任何网站都可以 使用相同的方法下载a Flickr成员的联系人列表。这是 交易破坏者。 (强调我的)
有人可以在这里考虑确切的安全风险(可能有样本利用)吗?如何通过脚本标记中的“src”属性加载给定文件,而不是通过AJAX调用加载该文件?
答案 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)不允许从运行它的站点以外的任何地方获取数据 - 浏览器有义务强制执行此规则。
对代码的来源没有相应的限制,因此如果您在代码中嵌入数据,则用户访问的任何网站都可以使用用户的凭据来获取用户的数据。