5

我正在处理在网页上注入的代码(使用浏览器插件或脚本标签)。

问题是我们想要使用全局对象和变量,比如JSON, window.location,String.split等,而这些的实现可能已经被网页改变了。这可能会使我们的代码失败,这是一个安全问题。

例子:

>>> String.prototype.split = function() { return 'foo'; };
function()
>>> 'a,b,c'.split(',');  // gives unexpected result
"foo"

那么,有没有办法像在更改之前一样访问浏览器的对象和函数的默认实现?它不必是标准的,我只希望功能存在。

4

1 回答 1

4

更新

也许更可行的方法是<iframe>动态创建一个空。

这是一个String.prototype.split在父窗口中污染但从<iframe>.

<html>
<head>
<script type="text/javascript">
    function onBodyLoad() {

        String.prototype.split = function() { return 'foo'; }; // contaminate original window
        console.log(String.prototype.split); // yeah, it's contaminated

        var acr = document.getElementById("accessor");
        acr.onclick = function ()
        {
            var dummyFrame = document.createElement("iframe");
            document.body.appendChild(dummyFrame); 
            console.log(dummyFrame.contentWindow.String.prototype.split); // uncontaminated
        }
    }
</script>
</head>
<body onload="onBodyLoad()">
    <a href="#" id="accessor">Access iframe Window object</a>
</body>
</html>

不是一般意义上的;尽管那里可能有一些异国情调的黑客。

我能想到的唯一方法是确保您的代码在任何其他脚本之前加载。如果满足该要求,则可以将必要的全局变量克隆到安全位置。

于 2012-06-12T09:22:02.143 回答