Фон
Скажем, у меня есть следующая веб-страница:
<html>
<script>
document.write('querystring=' + location.search.substr(1));
</script>
<html>
Я открываю его по URL-адресу, подобному этому:
http://completely-secure-site/?<script>alert('fsecurity')</script>
Во всех браузерах (Chrome 57, Firefox 52 и Safari 10) результат:
= QueryString% 3Cscript% 3Ealert (% 27fsecurity% 27)% 3C/ script% 3E
Поскольку угловые скобки <>
являются не действительными символами URL-адреса, они, похоже, автоматически кодируются браузером по пути, прежде чем они смогут добраться где-нибудь рядом с JS во время выполнения.
Мое предположение
Это заставляет меня думать, что просто рендеринг querystring непосредственно на клиенте с помощью document.write
всегда безопасен, а не возможный вектор XSS. (Я понимаю, что есть много других способов, в которых приложение может быть уязвимым, конечно, но пусть придерживается точного случая, описанного здесь.)
Мой вопрос
Правильно ли я в этом предположении?
- Является ли входящее кодирование небезопасных символов в URL, стандартизованном/утвержденным во всех разумных браузерах? (Невозможно XSS)
- Или это просто тонкая/реалистичная деталь некоторых (современных?) клиентов, на которых я не должен полагаться в глобальном масштабе? (Описанное выше XSS теоретически возможно)
Не относится к вопросу, но интересен в сторону. Если я сначала декодирую URI, тогда поведение браузера отличается: document.write(decodeURI(location.search.substr(1)));
. XSS Auditor в Chrome и Safari блокирует страницу, а Firefox показывает предупреждение.