2015-12-14 33 views
6

Napisałem trochę kodu w HTML5 + Javascript, że gdy użytkownik wprowadzi swoje nazwisko w polu User, zostanie ono odbite z powrotem jako "Hello <user>". Teraz ten skrypt jest podatny na XSS (Cross site scripting).Jak zapobiec XSS w poniższym kodzie?

Oto mój kod:

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="utf-8"/> 
<title>Forms Welcome</title> 

<script> 
function write_name(){ 

    var welcome_parra = document.getElementById('welcome'); 
    var name = document.getElementById('name'); 
    welcome_parra.innerHTML = "welcome " + name.value; 
} 
</script> 
</head> 

<body> 
    <p id="welcome"></p> 
    <form> 
     Username: <input type="text" name="username" maxlength="20" id="name"/> 
     <input type="button" value="done"onclick="write_name();"> 
    </form> 
/body> 

</title> 

Teraz, kiedy wchodzę ładunek "><img src=x onerror=prompt(404)>, otrzymuję monit o XSS. Jak mogę to naprawić?

Czy ktoś może sprawdzić hosta, spróbuj poprawić błąd i podać mi przyczynę?

+0

Witam! Witamy w stackoverflow! Edytowałem twoje pytanie, powinieneś umieścić kod w swoim pytaniu zamiast w linku zewnętrznym: D – Zorgatone

+0

Nie jest on podatny na XSS, ponieważ nikt nie może wprowadzić tekstu i kliknąć przycisku poza użytkownikiem. Jest to rodzaj ["self XSS"] (https://en.wikipedia.org/wiki/Self-XSS) Chyba, ale mogliby to zrobić za pomocą narzędzi programistycznych. – SilverlightFox

+0

Tak, nie jest podatny na Zapisane XSS, ale Self XSS. Ale jako programista musimy również temu zapobiec :) @SilverlightFox –

Odpowiedz

4

Można spróbować wykonać następujące czynności:

function checkInput(string) { 
    var regex = /^[^0-9*\\\^\/<>_#']+$/; 
    if(regex.test(string)) { 
     return true; 
    } else { 
     return false; 
    } 
} 

ten sposób by dowiedzieć się, czy litery są używane do XSS ataków, a następnie, po prostu nie wysłać formularz

Zamiast powyższego Używam również ten funkcja sprawdzania poprawności formularzy:

checkField:function(string, type) { 
    var regex; 
    switch (type) { 
     case "number": 
      regex = /^[\d]+$/; 
      break; 
     case "string": 
      regex = /^[^0-9*\\\^\/<>_#']+$/; 
      break; 
     case "email": 
      regex = /^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,7})+$/; 
      break; 
    } 
    if (regex.test(string)) { 
     return true; 
    } 
    return false; 
}, 

gdzie można dodać tyle przypadków, ile chcesz i potrzebujesz. Mam nadzieję, że to może pomóc w jakikolwiek sposób

Ale żeby być w 100% bezpieczne ataków XSS trzeba zatwierdzić formularz na serwerze, dlatego śledzę 2 proste zasady:
Zasada numer jeden: nie wolno używać formularz data' s niezaznaczona
Zasada numer dwa: nigdy nie używaj danych formularza bez zastępowania skryptu lub odpowiednich elementów kodu, takich jak <%>/\ i tak na

Ponieważ mogłem skopiować formularz i wysłać go pod dokładny adres, pominąłbym sprawdzanie/sprawdzanie po stronie klienta, ale dla twojego przypadku, ponieważ nie wysyłasz formularza w inne miejsce, zapobieganie wprowadzaniu kodu powinno wystarczyć.

UP DATA:

JavaScript kompiluje wymyślnej ataki XSS na bazie brainfuck, tylko na przykład

(+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+([][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[[+!+[]]+[!+[]+!+[]+!+[]+!+[]]]+[+!+[]]+([][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]])() 

które dadzą się 1 w oknie alertu ...

stosowanych litery powinny być sprawdzane aswell

+0

Dziękuję @TeaTime. Tak, pomogło również zatwierdzenie formularza. Próbowałem też kodowania w HTML-u, co również działa dobrze. –

6

Możesz kodować wejście przez kod HTML, aby było bezpieczne dla XSS. Dodaj funkcję: wejście

function escapeInput(input) { 
    return String(input) 
      .replace(/&/g, '&amp;') 
      .replace(/"/g, '&quot;') 
      .replace(/'/g, '&#39;') 
      .replace(/</g, '&lt;') 
      .replace(/>/g, '&gt;'); 
} 

i użytkownika kodowanie:

<script> 
function write_name(){ 

    var welcome_parra = document.getElementById('welcome'); 
    var name = document.getElementById('name'); 
    welcome_parra.innerHTML = "welcome " + escapeInput(name.value); 
} 
</script> 
+0

Świetnie. Wypróbowałem to. Bardzo dziękuję Pavel Morshenyuk za pomoc :) –

0

To bardzo proste, wystarczy przypisać do innerText zamiast innerHtml.

welcome_parra.innerText = "welcome " + name.value;