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
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.
|
|
|