2010-06-28 12 views
6

Ich habe ein WordPress-Plugin, das Seiten mit AJAX lädt und die Kompatibilität mit anderen Plugins und "Widgets" gewährleistet.Was ist die beste Methode zum dynamischen Sandbox-Inline-JavaScript?

Ab jetzt verwende ich den folgenden Code all Inline-JS zu bewerten, die in den Inhalten Blöcke aktualisiert werden:

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; 
    } 

Ich möchte in der Lage sein, den JS ein bisschen besser Sandbox so dass das Risiko von Konflikten minimiert wird. Eine Idee, die ich hatte, war, eine dynamisch zu erstellen und das JS darin auszuführen, aber ich hatte gehofft, dass es eine etwas bessere Methode gab, um sowohl die Kompatibilität sicherzustellen als auch die Sicherheit zu erhöhen.

Antwort

1

Die Chancen dafür sind Sie nicht genau das, was Sie brauchen, aber wie über das Skript Text in einer Funktion oder self-executing Funktionsliteral (function(){/*...*/})() wickeln.

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

Dies bietet mehr Schutz als gerade eval uation und hält den Code im selben Dokument. Der Nachteil ist, dass, wenn der Code, den Sie importieren, unordentlich ist über globale Variablen (was wahrscheinlich ist, warum Sie diese genaue Frage stellen), können Sie immer noch ihren Code stampfen auf anderen Code haben. Und wenn sie das this Schlüsselwort verwenden, wird ihr Code wahrscheinlich nicht wie vorgesehen funktionieren. Aber das wird zumindest korrekt deklarierte Variablen und Funktionsdeklarationen in einem gekapselten Bereich behalten.

Ich habe viel mit Code von Drittanbietern gearbeitet (meistens schrecklich, entsetzlich geschriebener Anzeigencode) und ich fand die beste Lösung darin, den Code in einem langen und einzigartigen Namensraum zu halten (mySiteUtils, mySiteGames, usw. oder com.mysite.utils, com.mysite.games, usw.). Wenn eine Werbeagentur entscheidet, Code in Ihren exakten Namespace einzutragen, wird Ihre Seite zerstört. Bisher ist dies jedoch noch nie passiert.

2

Sie könnten versuchen, das Javascript mit caja neu zu kompilieren: http://en.wikipedia.org/wiki/Caja_project

+0

Leider läuft dieses Plugin auf Hunderten von Websites, die ich überhaupt nicht kontrolliere, so dass ich keine JS-Snippets durch Caja wie eine Site wie MySpace ausführen kann. Die Lösung muss neu verteilt werden können. –

Verwandte Themen