2015-07-31 31 views
11

Sto imparando la prevenzione xss tramite questo ppt: http://stash.github.io/empirejs-2014/#/2/23, e ho una domanda in questa pagina.cosa significa "sanitizzazione JavaScript non ti salva da innerHTML"?

si dice "sanificazione JavaScript non ti salva dalla innerHTML", e ho provato un semplice test come questo:

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

quando ho aperto questo html con il mio browser (Chrome), ho visto solo il nome di "Jeremy", utilizzando F12, ho visto

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

Sebbene lo script fosse stato aggiunto ad html, la finestra di avviso non è stata pubblicata.

"La disinfezione JavaScript non ti salva da innerHTML" Penso che questo significhi che la parola "boom" debba essere avvisata. Ho ragione?

+3

"* Ho ragione? *". No. * innerHTML * non esegue script. – RobG

+0

innerHTML * può * essere eseguito per eseguire script tramite l'uso di attributi in linea. –

risposta

7

Secondo MDN, innerHTML impedisce <script> elementi da eseguire direttamente , il che significa che il test non dovrebbe avvertire nulla. Tuttavia, non impedisce gestori di eventi di sparare più tardi, il che rende la seguente possibile:

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

(copione adattato dall'esempio in questo articolo, con sequenze di escape anche se sono non sono sicuro questi sono rilevanti al di fuori del <script> elementi)

Dal <script> elementi mai eseguire quando inserita tramite innerHTML, non è chiaro per me quello che slitta sta cercando di trasmettere con quell'esempio.


Questo è effettivamente specificato in HTML5. Collegamenti MDN a una bozza del 2008; nella corrente W3C Recommendation, è situato vicino alla fine della sezione 4.11.1, just before section 4.11.1.1 begins:

Nota: volta inserito con il metodo document.write(), script elementi eseguire (tipicamente sincrono), ma quando inserito utilizzando innerHTML e outerHTML attributi, non vengono eseguiti affatto.