2015-07-31 7 views
11

Uczę się zapobiegania xss poprzez ten ppt: http://stash.github.io/empirejs-2014/#/2/23 i mam pytanie na tej stronie.co oznacza "sanityzacja JavaScriptu, która nie chroni cię przed wewnętrznym HTML"?

mówi "dezynfekcja JavaScript nie zaoszczędzić od innerHTML" i próbowałem prosty test takiego:

<!doctype html> 
 
<html> 
 
<head> 
 
    <meta charset="utf-8"> 
 
    <title>test</title> 
 
</head> 
 
<body> 
 
    <div id="test"></div> 
 
    <script> 
 
    var userName = "Jeremy\x3Cscript\x3Ealert('boom')\x3C/script\x3E"; 
 
    document.getElementById('test').innerHTML = "<span>"+userName+"</span>"; 
 
    </script> 
 
</body> 
 
</html>

kiedy otworzyłem ten kod HTML na mojej przeglądarce (Chrome), widziałem tylko nazwę "Jeremy", za pomocą klawisza F12, widziałem

<div id="test"><span>Jeremy<script>alert('boom')</script></span></div> 

Mimo że skrypt został dodany do html, okno alertu nie pojawiło się.

"Czyszczenie JavaScript nie chroni przed wewnętrznym HTML" Myślę, że to oznacza, że ​​słowo "boom" powinno być ostrzeżone. Czy mam rację?

+3

"* Mam rację? *". Nie. * InnerHTML * nie wykonuje skryptów. – RobG

+0

innerHTML * można * wykonać, aby wykonać skrypt za pomocą wbudowanych atrybutów. –

Odpowiedz

7

Według MDN, innerHTML zapobiega <script> elementy z wykonaniem bezpośrednio , co oznacza, że ​​test nie powinien niczego ostrzec. Jednak to nie przeszkadza obsługi zdarzeń z wypalania później, co sprawia, że ​​następujące możliwości:

var name = "\x3Cimg src=x onerror=alert(1)\x3E"; 
 
document.getElementById('test').innerHTML = name; // shows the alert
<div id="test"></div>

(scenariusz zaadaptowany z przykładu w artykule, ze sekwencje chociaż jestem nie wiem, to są istotne poza <script> elementów)

od <script> elementy nigdy wykonania po włożeniu poprzez innerHTML, to nie jest dla mnie jasne, co to slajd stara się przekazać z ten przykład.


To jest rzeczywiście określony w HTML5. Łącza MDN do wersji roboczej z 2008 r .; w bieżącym rekomendacja W3C, to znajduje się blisko końca sekcji 4.11.1, just before section 4.11.1.1 begins:

Uwaga: Po włożeniu stosując metodę document.write(), script elementy realizacji (zwykle synchronicznie), ale po włożeniu i korzystania innerHTMLouterHTML atrybutów, nie są one w ogóle wykonywane.

Powiązane problemy