2011-11-29 13 views
8

Testuję ataki xss na mój własny kod. Poniższy przykład to proste pole, w którym użytkownik może wpisać, co chce. Po naciśnięciu "testuj!" Przycisk, JS pokaże ciąg wejściowy na dwa divs.This jest przykładem zrobiłem lepiej wyjaśnić moje pytanie:html() vs innerHTML jquery/javascript i ataki XSS

<html> 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> 
<script type="text/javascript"> 
    function testIt(){ 
     var input = document.getElementById('input-test').value; 
     var testHtml = document.getElementById('test-html'); 
     var testInnerHTML = document.getElementById('test-innerHTML'); 
     $(testHtml).html(input); 
     testInnerHTML.innerHTML = input; 
    } 
</script> 
<head>this is a test</head> 
<body> 
    <input id="input-test" type="text" name="foo" /> 
    <input type="button" onClick="testIt();" value="test!"/> 
    <div id="test-html"> 
    </div> 
    <div id="test-innerHTML"> 
    </div> 
</body> 

jeśli spróbujesz skopiować go do pliku .html i uruchomić go, będzie działać dobrze, ale jeśli spróbujesz wprowadzić <script>alert('xss')</script>, tylko jedno pole ostrzeżenia zostanie wygenerowane: to, które znajduje się w `test-html 'div (z funkcją html()).

Naprawdę nie mogę zrozumieć, dlaczego tak się dzieje, a także sprawdzania kodu z Firebug daje mi ten wynik (po wstrzyknięciu skryptu)

<body> 
this is a test 
<input id="input-test" type="text" name="foo"> 
<input type="button" value="test!" onclick="testIt();"> 
<div id="test-html"> </div> 
<div id="test-innerHTML"> 
    <script> 
    alert('xss') 
    </script> 
</div> 
</body> 

jak widać test-html div jest pusta, i test-innerhtml div contans the script. Czy ktoś może mi powiedzieć, dlaczego? Czy dlatego, że html() jest bezpieczniejszy przed injekcją skryptów lub czymś podobnym?

Z góry dziękuję, pozdrawiam.

+2

Nie musisz się martwić o bezpieczeństwo, co użytkownik wpisze , ponieważ jakikolwiek skrypt, który spróbują wstawić, będzie tylko af podrób je w tym momencie. To, o co musisz się martwić, to to, co dzieje się, gdy wprowadzony tekst zostanie przesłany na twój serwer sieciowy - jeśli przechowujesz go w bazie danych, musisz być pewien, że nie ślepo połączysz wprowadzony tekst pod koniec SQL pytanie. Jeśli później powrócisz do poprzednio wprowadzonego tekstu, musisz mieć pewność, że wprowadzona wartość została zmieniona, tak że np. "

0

jquery html tak nie odda tagów skryptu

ale nie jest to bardziej bezpieczne ponieważ można używać wielu innych ładunków, takich jak XSS <a href> stylu, ekspresji etc ..

+0

To * jest * bezpieczniejsze, po prostu nie jest * całkowicie * bezpieczne i nie powinno na nim polegać. – Mario

+0

Tak, to prawda, ale bezpieczne nie jest to słowo, po prostu zgódźmy się, że jest mniej podatny na atak niż innerHTML. – Ben

+0

W rzeczywistości ** to, co robi jQuery, jest bardziej podatne na wykorzystanie **, ponieważ pierwszą rzeczą, którą jQuery robi, gdy znajduje "

Powiązane problemy