动态沙箱内联JavaScript的最佳方法是什么?
我有一个WordPress插件,它使用AJAX加载页面,并确保与其他插件和“小部件”兼容 到目前为止,我使用以下代码评估要更新的内容块中的所有内联JS:动态沙箱内联JavaScript的最佳方法是什么?,javascript,ajax,security,sandbox,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.innerHTM
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;
}
函数do_JS(e){
var Reg='(?:)(\n |.*?)(?:)';
var match=新的RegExp(Reg,'img');
var scripts=e.innerHTML.match(匹配);
var doc=document.write;
document.write=function(p){e.innerHTML=e.innerHTML.replace(scripts[s],p)};
如果(脚本){
对于(var s=0;s我希望能够更好地对JS进行沙箱处理,从而将冲突风险降至最低。我的一个想法是动态创建一个
并在其中运行JS,但我希望有更好的方法来确保兼容性和提高安全性。您可以尝试使用caja重新编译javascript:
很可能这并不能完全满足您的需要,但如何将脚本文本包装到函数或自动执行函数文本
(function(){/*…*/})(
)
var strEval = 'try{';
strEval += 'widget[' + intWidgetNumber + '] = (function(){';
strEval += js;
strEval += '})();';
strEval += '}catch(e){}';
这比直接的eval
uation提供了更多的保护,并将代码保存在同一文档中。缺点是,如果您导入的代码在全局变量方面比较混乱(这可能就是您提出这个确切问题的原因),您仍然可以让它们的代码在其他代码上跺脚。如果他们使用this
关键字,他们的代码可能无法正常工作。但这至少会将正确声明的变量和函数声明保存在一个封装的范围内
我曾经使用过很多第三方代码(大多是写得非常糟糕的广告代码),我发现最好的解决方案是将您的站点代码包装在一个冗长而独特的名称空间中(mySiteUtils、mySiteGames等,或com.mysite.utils、com.mysite.games等)。如果广告代理决定插入与您的确切名称空间匹配的代码,他们将破坏您的页面,但到目前为止,这种情况从未发生过 不幸的是,这个插件运行在数百个我根本无法控制的站点上,所以我不能像myspace这样的站点那样通过Caja运行JS代码片段。解决方案需要是可再发行的。