JavaScript完全“篡改安全”的变量

13

所以,这里是问题。

我有类似以下的东西:

// Dangerous __hostObject that makes requests bypassing 
// the same-origin policy exposed from other code.
(function(){
    var danger = __hostObject;
})();
delete __hostOBject;

如果没有脚本能够篡改或访问__hostObject,我是否完全安全?(如果可以的话,我可能存在CSRF漏洞或更严重的问题。)

注1:这是针对浏览器扩展程序的。我的钩子比页面上运行的其他脚本更好。我在它们之前执行,并且在它们甚至加载完成之前就完成了。

注2:我知道这个问题已经被多次提出,针对一般脚本。我想知道如果我知道我在任何其他脚本之前加载,是否有可能。


我已经编写了一个示例代码,它覆盖了Function.prototype.call。(如果您真的认为我在帮助恶意开发人员,请随时标记此帖子。在我看来,最终的攻击者无论如何都会知道这些技术。) - ComFreek
1
@ComFreek 你忘记了return oldCall的结果。但事实上,这是猴子补丁(内置)JavaScript方法所使用的一般原则。 - Rob W
2个回答

5
只要__hostObject可删除,你问题中的代码是安全的。
然而,我假设你实际的代码会更加复杂。在这种情况下,需要非常小心编码,因为页面可以改变内置方法(例如Function.prototype.call),进入你的闭包并做任何恶意行为。当我进行这样的测试时,我已经成功地滥用了扩展框架(如Kango和Crossrider)的功能。

1
@BenjaminGruenbaum 滥用功能的代码非常简单,我不会发布示例代码以避免滋养恶意开发者。我只是在回答你的另一个问题,敬请关注 ;) - Rob W
对不起,各位。我正在努力理解问题和解决方案,但是还无法理解。你们能否再解释一下? - thefourtheye
@BenjaminGruenbaum 首先,关于你的问题。我不明白实际的问题是什么 :( - thefourtheye
@BenjaminGruenbaum 你只需要保存在代码中调用的任何函数之外可用的闭包引用,如对bind、apply、array构造函数等的调用,并使用它们代替即可。 - Moritz Roessler
@C5H8NNaO4 我提供 Function.prototype.call 只是作为一个例子。那么 var data = __hostObject.getSensitiveData();if(data.split(';')[0] == something) { ... } 呢?包装所有可能的继承调用非常麻烦且容易出错。想象一下以这种方式修补第三方库会有多有趣? - Rob W
显示剩余8条评论

0

仅仅添加一个断点并重新加载脚本不会暴露你的__hostObject吗?


问题不在于实际用户,而是其他我无法信任的脚本干扰它。就我所知,另一个脚本不能做到这一点。 - Benjamin Gruenbaum
好的,那听起来是真的。 - Verneri Åberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接