3

在许多网页上,我们都包含外部脚本。无论是 facebook 之类的按钮、分析或广告系统的客户端代码、外部评论提供者或其他东西。

这些脚本无法访问我的 Ajax 资源,因为一直在检查原始标头。

但是,我有点担心这些脚本可以对我页面上的 websocket 连接做什么。据我所知,在这里,仅在握手期间检查原始标头。

假设我打开一个连接并像这样定义一个 onmessage 处理程序

var ws = new WebSocket("ws://host/resource");
ws.onmessage = function(evt) { my stuff ... }

外部脚本是否无法重新分配 onmessage 处理程序,从而无法访问我的服务器通过 websocket 发送到浏览器的所有内容?喜欢

var oldHandler = ws.onmessage;
ws.onmessage = function(evt) { 
   externalscript.readMystuffAndDoEvilThings(evt); 
   oldHandler(evt); 
}

我不明白为什么这是不可能的。wss:// 和会话 cookie 或其他东西都不会阻止它。但也许我错过了什么?

4

1 回答 1

1

你没有错过任何东西。如果您已将外部(跨域)脚本加载到浏览上下文中,则该脚本具有与“本地”(同源)脚本相同的权限。外部脚本可以以同样的方式替换您的 XHR 回调、console.log-s 和其他所有内容。

此类恶意外部脚本的问题在于 a) 您必须愿意将它们加载到您的应用程序中,并且 b) 脚本必须知道要替换什么(函数/变量名称)。

防止此类攻击的方法是使用所谓的 JavaScript 模块模式——将所有代码包装在一个匿名函数中并立即执行该函数。这样,您的代码就不会受到外部脚本的影响,因为它在闭包(本地范围)内执行。有关该模式的更多信息和变体,请参阅此:http: //addyosmani.com/resources/essentialjsdesignpatterns/book/#modulepatternjavascript

于 2013-01-06T22:28:06.150 回答