这篇flickr博客文章讨论了他们对人物选择器自动完成的最新改进背后的想法.
他们必须克服的一个问题是如何解析和处理客户端这么多数据(即所有联系人).他们尝试通过AJAX获取XML和JSON,但发现它太慢了.然后他们说这是通过动态生成的脚本标记(带回调函数)加载数据:
JSON和动态脚本标记:快速但不安全
使用大字符串操作是最后一种方法的问题的理论,我们从使用Ajax转而使用动态生成的脚本标记来获取数据.这意味着联系人数据从未被视为字符串,而是在下载后立即执行,就像任何其他JavaScript文件一样.性能差异令人震惊:解决10,000个联系人的时间为89毫秒(减少了3个数量级),而172个联系人的最小情况只需要6毫秒.每个联系人的解析时间实际上减少了,列表变得越大.这种方法看起来很完美,除了一件事:为了执行这个JSON,我们必须将它包装在一个回调方法中.由于它是可执行代码,世界上任何网站都可以使用相同的方法下载Flickr成员的联系人列表.这是一个交易破坏者.(强调我的)
有人可以在这里考虑确切的安全风险(可能有样本利用)?如何通过脚本标记中的"src"属性加载给定文件,而不是通过AJAX调用加载该文件?
这是一个很好的问题,这种漏洞曾经被用来从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
如果我要在我的网站上放置一个HTML页面,如下所示:
假设contacts.js使用会话来知道要发送的联系人,我现在将拥有您的联系人副本.
但是,如果通过JSON发送联系人,我无法从我的HTML页面请求它们,因为它将是一个跨域AJAX请求,这是不允许的.我也无法从我的服务器请求页面,因为我没有你的会话ID.