动态沙箱内联JavaScript的最佳方法是什么?

时间:2010-06-28 04:55:35

标签: javascript ajax security sandbox

我有一个WordPress插件,可以使用AJAX加载页面,并确保与其他插件和“小部件”的兼容性。

截至目前,我使用以下代码来评估要更新的内容块中的所有内联JS:

  function do_JS(e){
        var Reg = '(?:<script.*?>)((\n|.)*?)(?:</script>)';
        var match    = new RegExp(Reg, 'img');
        var scripts  = e.innerHTML.match(match);
        var doc = document.write;
        document.write = function(p){ e.innerHTML = e.innerHTML.replace(scripts[s],p)};
        if(scripts) {
            for(var s = 0; s < scripts.length; s++) {
                var js = '';
                var match = new RegExp(Reg, 'im');
                js = scripts[s].match(match)[1];
                js = js.replace('<!--','');
                js = js.replace('-->','');
                eval('try{'+js+'}catch(e){}');
            }
        }
        document.write = doc;
    }

我希望能够更好地对JS进行沙盒处理,以便最大限度地减少冲突风险。我的一个想法是动态创建一个<iframe>并在其中运行JS,但我希望有一个更好的方法来确保兼容性和提高安全性。

2 个答案:

答案 0 :(得分:2)

您可以尝试使用caja重新编译javascript: http://en.wikipedia.org/wiki/Caja_project

答案 1 :(得分:1)

这可能无法满足您的需求,但如何将脚本文本包装在函数或自执行函数文字(function(){/*...*/})()中。

var strEval =  'try{';
strEval += 'widget[' + intWidgetNumber + '] = (function(){';
strEval += js;
strEval += '})();';
strEval += '}catch(e){}';

这提供了比直接eval更多的保护,并将代码保存在同一文档中。缺点是,如果您导入的代码对全局变量很混乱(这可能就是您提出这个问题的原因),您仍然可以让代码踩在其他代码上。如果他们使用this关键字,他们的代码可能无法正常运行。但至少这将在封装范围内保持正确声明的变量和函数声明。

我经常使用第三方代码(主要是可怕的,可怕的广告代码),我发现最好的解决方案是将您的网站代码保存在一个冗长而独特的命名空间中(mySiteUtils,mySiteGames等) 。或com.mysite.utils,com.mysite.games等)。如果广告代理商决定放入与您的确切命名空间匹配的代码,则会破坏您的网页,但到目前为止,这种情况从未发生过。