2015-12-14 3 views
6

Я написал код в HTML5 + Javascript, что, когда пользователь вводит свое имя в User, он возвращается обратно как «Hello <user>». Теперь этот скрипт уязвим для XSS (межсайтовый скриптинг).Как предотвратить XSS в следующем коде?

Вот мой код:

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

Теперь, когда я вхожу в полезную нагрузку "><img src=x onerror=prompt(404)>, я получаю приглашение от XSS. Итак, как мне исправить это?

Может ли кто-нибудь, пожалуйста, проверить хост, попытаться исправить ошибку и дать мне повод?

+0

Hi! Добро пожаловать в stackoverflow! Я отредактировал ваш вопрос, вы должны поместить код в свой вопрос, а не по внешней ссылке: D – Zorgatone

+0

Это не _really_ уязвимо для XSS, потому что никто не может ввести текст и нажать кнопку отдельно от пользователя. Я думаю, это своего рода [«self XSS»] (https://en.wikipedia.org/wiki/Self-XSS), но тогда они могут это сделать с помощью инструментов разработчика. – SilverlightFox

+0

Да, он не уязвим для хранения XSS, но Self XSS. Но, как разработчик, нам также необходимо предотвратить это :) @SilverlightFox –

ответ

4

Вы можете попробовать следующее:

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

Таким образом, вы бы выяснить, используются буквы для XSS атак, а затем, просто не отправить форму

Вместо выше я использую это функция для проверки форм:

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; 
}, 

, где вы можете добавить столько случаев, сколько хотите и вам нужно. Я надеюсь, что это может помочь вам в любом случае

Но чтобы быть 100% гарантией безопасности от XSS атак вы должны проверить форму на сервере, поэтому я следую 2 простых правил:
Правило № Один: Никогда не используйте форму data' s unchecked
Правило номер два: никогда не используйте данные формы без замены сценария или кода, соответствующих частям, например <%>/\ и т. д.

Поскольку я мог бы просто скопировать вашу форму и отправить ее на точный адрес, я бы обошел проверка/проверка на стороне клиента, но для вашего случая, так как вы не отправляете форму в другое место, предупреждение для ввода кода должно быть достаточно

UP ДАТА:

Javascript компилирует некоторые фантазии атаки XSS на Brainfuck базу, навскидку

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

, который будет выдавать 1 в окне предупреждения ...

Те используемые буквы должны быть проверены как хорошо

+0

Спасибо @TeaTime. Да, валидация формы также помогла. Я также пробовал кодировать HTML-код, который также отлично работает. –

6

Вы можете кодировать HTML-код, чтобы сделать его XSS-безопасным. Добавить функцию: вход

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

И пользователя закодировать:

<script> 
function write_name(){ 

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

Отлично. Пробовал. Большое вам спасибо Павел Моршенюк за помощь :) –

0

Это очень легко, просто присвоить innerText вместо innerHtml.

welcome_parra.innerText = "welcome " + name.value; 
Смежные вопросы