Vermeiden von sicherheitsbezogenen JavaScript-Fehlern

Adobe AIR 1.0 und höher

Wenn Sie Code aufrufen, dessen Verwendung in einer Sandbox aus diesen Sicherheitsgründen beschränkt ist, löst die Laufzeitumgebung einen JavaScript-Fehler aus: „Adobe AIR runtime security violation for JavaScript code in the application security sandbox“ (Sicherheitsverstoß gegen Adobe AIR-Laufzeitumgebung für JavaScript-Code in der Sicherheits-Sandbox der Anwendung). Halten Sie sich an die folgenden Kodierungspraktiken, um diesen Fehler zu vermeiden.

Ursachen sicherheitsbezogener JavaScript-Fehler

Wenn das load -Ereignis des Dokuments ausgelöst und beliebige load -Ereignisprozeduren beendet wurden, ist in der Anwendungs-Sandbox ausgeführter Code von den meisten Operationen ausgenommen, bei denen Strings bewertet und ausgeführt werden. Bei dem Versuch, die folgenden Typen von JavaScript-Anweisungen zu verwenden, die potenziell unsichere Strings bewerten und ausführen, treten JavaScript-Fehler auf:

Zuordnen von Anwendungsinhalten zu einer anderen Sandbox

In den meisten Fällen können Sie eine Anwendung umschreiben oder umstrukturieren, um sicherheitsbezogene JavaScript-Fehler zu vermeiden. Ist ein Umschreiben oder Umstrukturieren nicht möglich, können Sie den Anwendungsinhalt stattdessen mit dem unter Laden von Anwendungsinhalten in eine anwendungsfremde Sandbox beschriebenen Verfahren in eine andere Sandbox laden. Wenn dieser Inhalt außerdem auf AIR-APIs zugreifen muss, können Sie eine Sandbox-Brücke erstellen, wie unter Einrichten einer Schnittstelle für Sandbox-Brücken beschrieben.

eval()-Funktion

Die eval() -Funktion kann in der Anwendungs-Sandbox nur vor dem load -Ereignis oder während der load -Ereignisprozedur verwendet werden. Nach dem Laden der Seite wird durch Aufrufen von eval() kein Code ausgeführt. In den folgenden Fällen können Sie den Code jedoch neuschreiben, um die Verwendung von eval() zu verhindern.

Zuweisen von Eigenschaften zu Objekten

Statt einen String zum Erstellen des Eigenschaften-Accessors wie folgt zu analysieren:

eval("obj." + propName + " = " + val);

Greifen Sie wie folgt auf Eigenschaften mit Klammern zu:

obj[propName] = val;

Erstellen von Funktionen mit im Kontext verfügbaren Variablen

Ersetzen Sie Anweisungen wie beispielsweise die folgende:

function compile(var1, var2){ 
    eval("var fn = function(){ this."+var1+"(var2) }"); 
    return fn; 
}

Durch:

function compile(var1, var2){ 
    var self = this; 
    return function(){ self[var1](var2) }; 
}

Erstellen von Objekten unter Verwendung des Klassennamens als Stringparameter

Sehen Sie sich eine mit folgendem Code definierte hypothetische JavaScript-Klasse an:

var CustomClass =  
    { 
        Utils: 
        { 
            Parser: function(){ alert('constructor') } 
        }, 
        Data:  
        { 
         
        } 
    }; 
var constructorClassName = "CustomClass.Utils.Parser";

Mit eval() ließe sich am einfachsten eine Instanz erstellen:

var myObj; 
eval('myObj=new ' + constructorClassName +'()')

Sie können das Aufrufen von eval() jedoch vermeiden, indem Sie jede Komponente des Klassennamens analysieren und das neue Objekt durch Verwenden von Klammern erstellen:

function getter(str) 
{ 
    var obj = window; 
    var names = str.split('.'); 
    for(var i=0;i<names.length;i++){ 
        if(typeof obj[names[i]]=='undefined'){ 
            var undefstring = names[0]; 
            for(var j=1;j<=i;j++) 
                undefstring+="."+names[j]; 
            throw new Error(undefstring+" is undefined"); 
        } 
        obj = obj[names[i]]; 
    } 
    return obj; 
}

Verwenden Sie folgenden Code zum Erstellen der Instanz:

try{ 
    var Parser = getter(constructorClassName); 
    var a = new Parser(); 
    }catch(e){ 
        alert(e); 
}

setTimeout() und setInterval()

Ersetzen Sie den an die Prozedurfunktion übergebenen String durch einen Funktionsverweis oder ein Objekt. Ersetzen Sie beispielsweise folgende Anweisung:

setTimeout("alert('Timeout')", 100);

Durch:

setTimeout(function(){alert('Timeout')}, 100); 

Muss bei der Funktion das this -Objekt vom Aufrufer festgelegt werden, ersetzen Sie folgende Anweisung:

this.appTimer = setInterval("obj.customFunction();", 100);

durch Folgendes:

var _self = this; 
this.appTimer = setInterval(function(){obj.customFunction.apply(_self);}, 100);

Function-Konstruktor

Aufrufe von new Function(param, body) können durch eine Inline-Funktionsdeklaration ersetzt oder nur vor der Verarbeitung des load -Ereignisses der Seite verwendet werden.

javascript: URLs

Der Code in einer Verknüpfung, die das javascript:-URL-Schema verwendet, wird in der Anwendungs-Sandbox ignoriert. Es wird kein sicherheitsbezogener JavaScript-Fehler generiert. Sie können Verknüpfungen z. B. mit folgenden javascript:-URLs ersetzen:

<a href="javascript:code()">Click Me</a>

Durch:

<a href="#" onclick="code()">Click Me</a>

Ereignisrückrufe, die über die onevent-Attribute in innerHTML- und outerHTML-Anweisungen zugewiesen wurden

Wenn Sie dem DOM eines Dokuments mit innerHTML oder outerHTML Elemente hinzufügen, werden alle in der Anweisung zugewiesenen Ereignisrückrufe wie onclick oder onmouseover ignoriert. Es wird kein Sicherheitsfehler generiert. Stattdessen können Sie den neuen Elementen ein id -Attribut zuweisen und die Rückruffunktionen der Ereignisprozedur mit der addEventListener() -Methode festlegen.

Enthält ein Dokument z. B. folgendes Zielelement:

<div id="container"></div>

Ersetzen Sie Anweisungen wie:

document.getElementById('container').innerHTML =  
    '<a href="#" onclick="code()">Click Me.</a>';

Durch:

document.getElementById('container').innerHTML = '<a href="#" id="smith">Click Me.</a>'; 
document.getElementById('smith').addEventListener("click", function() { code(); });

Laden von JavaScript-Dateien aus Verzeichnissen außerhalb des Anwendungsinstallationsverzeichnisses

Das Laden von Skriptdateien von außerhalb der Anwendungs-Sandbox ist nicht zulässig. Es wird kein Sicherheitsfehler generiert. Alle in der Anwendungs-Sandbox ausgeführten Skriptdateien müssen im Anwendungsverzeichnis installiert sein. Wenn in einer Seite externe Skripts verwendet werden sollen, müssen Sie die Seite einer anderen Sandbox zuweisen. Siehe Laden von Anwendungsinhalten in eine anwendungsfremde Sandbox .

document.write() und document.writeln()

Aufrufe von document.write() oder document.writeln() werden nach Verarbeitung des load -Ereignisses ignoriert. Es wird kein Sicherheitsfehler generiert. Alternativ können Sie eine neue Datei laden oder den Dokumentkörper mit DOM-Manipulationsverfahren ersetzen.

Synchrone XMLHttpRequests vor dem load-Ereignis oder während einer load-Ereignisprozedur

Synchrone XMLHttpRequests, die vor der Durchführung des load -Ereignisses einer Seite oder während der Ausführung der load -Ereignisprozedur initiiert werden, geben keinen Inhalt zurück. Asynchrone XMLHttpRequests können zwar initiiert werden, geben aber erst nach dem load -Ereignis Inhalt zurück. Nach der Verarbeitung des load -Ereignisses verhalten sich synchrone XMLHttpRequests wie üblich.

Dynamisch erstellte Skriptelemente

Dynamisch erstellte Skriptelemente, wie die mit innerHTML oder der document.createElement() -Methode erstellten, werden ignoriert.