Этот код уязвим для атак XSS?
Вопрос возник из этого:
Почему браузер изменяет идентификатор элемента HTML, который содержит &#Икс?
Учитывая следующую веб-страницу:
// --------------------------------------------------------
// could calling this method produce an XSS attack?
// --------------------------------------------------------
function decodeEntity(text){
text = text.replace(//g,''); // strip out all HTML tags, to prevent possible XSS
var div = document.createElement('div');
div.innerHTML = text;
return div.textContent?div.textContent:div.innerText;
}
function echoValue(){
var e = document.getElementById(decodeEntity("/path/$whatever"));
if(e) {
alert(e.innerHTML);
}
else {
alert("not found\n");
}
}
<p id="/path/$whatever">The Value</p>
Tell me
id
из
Элемент содержит символы, которые были экранированы для предотвращения атак XSS. Часть HTML и часть JS генерируются сервером, и сервер вставляет одинаковое экранированное значение (которое может происходить из незащищенного источника) в обе части.
Сервер экранирует следующие диапазоны символов в&#x
формат:
Другими словами: единственные символы, которыене избежали:
0x2E - 0x39 (,,).
/
0123456789
0x41 - 0x5A (A
- )Z
0x5F ()_
0x61 - 0x7A (a
- )z
Теперь я должен получить доступ к этому
через JavaScript. ФункцияechoValue()
в указанном вопросе всегда не удалось, потому что браузер конвертирует$
в$
в части HTML, но оставляет его как$
в части JS.
Так,Gareth придумалответ это просто и работает.
Меня беспокоит то, что возможность XSS-атаки, которая была устранена путем экранирования динамических строк, снова возникнет при использованииdecodeEntity()
Функция предоставлена в ссылочном ответе.
Кто-нибудь может указать, могут ли быть проблемы безопасности (который?) или нет (почему бы и нет?)?