代码之家  ›  专栏  ›  技术社区  ›  Aaron Butacov

动态沙盒内联javascript的最佳方法是什么?

  •  6
  • Aaron Butacov  · 技术社区  · 14 年前

    我有一个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 回复  |  直到 14 年前
        1
  •  1
  •   Andrew    14 年前

    很可能这并不能满足您的需求,但是如何将脚本文本包装在函数或自执行函数文本中呢? (function(){/*...*/})() .

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

    这比直接提供更多的保护 eval uation and keeps the code in the same document. 缺点是,如果您导入的代码在全局变量方面很混乱(这可能就是您问这个确切问题的原因),那么您仍然可以让它们的代码在其他代码上乱跳。如果他们使用 this 关键字,它们的代码可能无法按预期工作。But this at least will keep properly declared variables and function declarations in an encapsulated scope.

    I've worked with third-party code a lot (mostly horribly, horribly written ad code) and I've found the best solution is to keep your site code wrapped in a lengthy and unique namespace (mySiteUtils, mySiteGames, etc. or com.mysite.utils, com.mysite.games, etc.). 如果广告公司决定输入与您的准确名称空间相匹配的代码,他们会破坏您的页面,但到目前为止,这从未发生过。

        2
  •  2
  •   Joeri Sebrechts    14 年前

    您可以尝试用CAJA重新编译JavaScript: http://en.wikipedia.org/wiki/Caja_project