Det finns begränsningar för HTML-innehåll i programsäkerhetssandlådan för att använda API:er som kan omvandla strängar dynamiskt till körbar kod efter att koden har lästs in (efter att händelsen
onload
i
body
-elementet har skickats och körningen av
onload
-hanterarfunktionen är slutförd). Detta är till för att förhindra programmet från att av misstag föra in (och köra) kod från källor som inte tillhör programmet (som till exempel potentiellt osäkra nätverksdomäner).
Om ditt program till exempel använder strängdata från en fjärrkälla för att skriva till egenskapen innerHTML i ett DOM-element, skulle strängen kunna innehålla körbar (JavaScript) kod som skulle kunna utföra osäkra operationer. Det är dock ingen risk att fjärrsträngar förs in i DOM medan innehållet laddas.
En begränsning är användandet av JavaScript-funktionen
eval()
. När kod i programsandlådan väl är inläst och efter bearbetning av onload-händelsehanteraren, kan du endast använda funktionen
eval()
på begränsade sätt. Följande regler gäller för användande av funktionen
eval()
efter
att kod är inläst från programsäkerhetssandlådan:
-
Uttryck som innefattar litteraler är tillåtna. Till exempel:
eval("null");
eval("3 + .14");
eval("'foo'");
-
Objektlitteraler är tillåtna, som i följande:
{ prop1: val1, prop2: val2 }
-
Set-/get-metoder för objektlitteraler är
ej tillåtna
, som i följande:
{ get prop1() { ... }, set prop1(v) { ... } }
-
Arraylitteraler är tillåtna, som i följande:
[ val1, val2, val3 ]
-
Uttryck som innefattar egenskapsläsningar är
ej tillåtna
, som i följande:
a.b.c
-
Funktionsanrop är
ej tillåtna.
-
Funktionsdefinitioner är
ej tillåtna.
-
Inställning av egenskaper är
ej tillåten.
-
Funktionslitteraler är
ej tillåtna.
Medan koden läses in, innan
onload
-händelsen och under körningen av
onload
-händelsehanterarfunktionen, gäller dock dessa begränsningar inte för innehåll i programsäkerhetssandlådan.
Efter att exempelvis kod har lästs in, resulterar följande kod i att körtiden utlöser ett undantag:
eval("alert(44)");
eval("myFunction(44)");
eval("NativeApplication.applicationID");
Dynamiskt genererad kod som till exempel den som tillverkas när funktionen
eval()
anropas skulle utgöra en säkerhetsrisk om den var tillåten inuti programsandlådan. Ett program kan till exempel av misstag köra en sträng som är inläst från en nätverksdomän, och den strängen kan innehålla uppsåtlig kod. Detta skulle till exempel kunna vara kod för att ta bort eller ändra filer på användarens dator. Det skulle också kunna vara kod som rapporterar innehållet i en lokal fil till en icke tillförlitlig nätverksdomän.
Följande sätt att generera dynamisk kod finns:
-
Anropa funktionen
eval()
.
-
Använda
innerHTML
-egenskaper eller DOM-funktioner för att infoga script-taggar som läser in ett skript utanför programkatalogen.
-
Använda
innerHTML
-egenskaper eller DOM-funktioner för att infoga script-taggar som har intern kod (istället för att läsa in ett skript via attributet
src
).
-
Ställa in attributet
src
för en
script
-tagg till att läsa in en JavaScript-fil som ligger utanför programkatalogen.
-
Använda URL-schemat
javascript
(som i
href="javascript:alert('Test')"
).
-
Använda funktionen
setInterval()
eller
setTimout()
där den första parametern (som definierar att funktionen ska köras asynkront) är en sträng (som ska utvärderas) istället för ett funktionsnamn (som i
setTimeout('x = 4', 1000)
).
-
Anropa
document.write()
eller
document.writeln()
.
Kod som finns i programsäkerhetssandlådan kan bara använda dessa metoder medan innehåll läses in.
Dessa begränsningar förhindrar
inte
användandet av
eval()
med JSON-objektlitteraler. Detta gör att ditt programinnehåll kan arbeta med JavaScript-biblioteket JSON. Du hindras dock från att använda överlagrad JSON-kod (med händelsehanterare).
Om du vill använda andra Ajax-ramverk och JavaScript-kodbibliotek, bör du kontrollera om kod i ramverket eller biblioteket fungerar inom dessa restriktioner för dynamiskt genererad kod. Om de inte fungerar, ska du inkludera allt innehåll som använder ramverket eller biblioteket i en icke-programsäkerhetssandlåda. Mer information finns i
Begränsningar för JavaScript inne i AIR
och
Skriptning mellan program- och icke-programinnehåll
. Adobe har en lista över Ajax-ramverk som stöder programsäkerhetssandlådan på
http://www.adobe.com/products/air/develop/ajax/features/
.
Till skillnad från innehåll i programsäkerhetssandlådan,
kan
JavaScript-innehåll i en icke-programsäkerhetssandlåda anropa funktionen
eval()
för att när som helst köra dynamiskt genererad kod.