保护websockets免受外部脚本的影响

时间:2013-01-06 22:07:45

标签: security browser websocket cross-domain

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

这些脚本无法访问我的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或其他东西都不会阻止它。但也许我错过了什么?

1 个答案:

答案 0 :(得分:1)

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

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

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

相关问题