При выводе пользовательского ввода вы используете только htmlspecialchars()
или есть функции / действия / методы, которые вы также запускаете? Я ищу что-то, что будет иметь дело с XSS.
Мне интересно, следует ли мне написать функцию, которая избегает ввода пользователем на выходе или просто использует htmlspecialchars()
. Я ищу общие случаи, а не конкретные случаи, которые можно решать индивидуально.
Обычно я использую
htmlspecialchars($var, ENT_QUOTES)
по полям ввода. Я создал метод, который делает это, потому что я использую это много, и он делает код короче и читабельнее.
Давайте быстро рассмотрим, почему ускорение требуется в разных контекстах:
Если вы находитесь в строке с разделителями с кавычками, вам нужно уйти от котировок. Если вы находитесь в xml, вам нужно отделить «контент» от «разметки». Если вы находитесь в SQL, вам нужно отделить «команды» от «данных». Если вы находитесь в командной строке, вам нужно отделить «команды», из "данных"
Это действительно основной аспект вычислений в целом. Поскольку синтаксис, который ограничивает данные, может произойти В ДАННЫХ, должен быть способ дифференцировать DATA из SYNTAX, следовательно, экранировать.
В веб-программировании общие случаи экранирования: 1. Вывод текста в HTML 2. Вывод данных в атрибуты HTML 3. Вывод HTML в HTML 4. Вставка данных в Javascript 5. Вставка данных в SQL 6. Вставка данных в команду оболочки
Каждый из них имеет разные последствия для безопасности при неправильном обращении. ЭТО ДЕЙСТВИТЕЛЬНО ВАЖНО! Давайте рассмотрим это в контексте PHP:
Текст в HTML: htmlspecialchars (…)
Данные в атрибуты HTML htmlspecialchars (…, ENT_QUOTES)
HTML в HTML Используйте библиотеку, такую как HTMLPurifier, чтобы убедиться, что присутствуют только действительные теги.
Данные в Javascript я предпочитаю json_encode
. Если вы поместите его в атрибут, вам все равно нужно использовать # 2, например
Вставка данных в SQL Каждый драйвер имеет некоторую функцию escape (). Это лучше. Если вы работаете в обычном наборе символов latin1, то подходит addlashes (…). Не забывайте цитаты ВОКРУГ вызова addlashes ():
"INSERT INTO table1 SET field1 = '". addlashes ($ data). «'»
Данные командной строки escapeshellarg () и escapeshellcmd () – прочитайте руководство
– Примите это близко к сердцу, и вы устраните 95% * общих рисков безопасности в Интернете! (* догадка)
Вы не должны очищать текст от вывода, это должно происходить на входе. Я использую фильтр, который фильтрует все входные данные приложения. Он настраивается так, что он может разрешать определенные теги / данные при необходимости (скажем, для редактора wysiwig).
Вы должны делать как можно меньше обработки текста на выходе, чтобы обеспечить скорость. Обработка его однажды создает намного меньше нагрузки, а затем обрабатывает ее 500,0000 раз.