Вы только запускаете htmlspecialchars () на выходе или есть другие функции, которые вы также делаете?

При выводе пользовательского ввода вы используете только htmlspecialchars() или есть функции / действия / методы, которые вы также запускаете? Я ищу что-то, что будет иметь дело с XSS.

Мне интересно, следует ли мне написать функцию, которая избегает ввода пользователем на выходе или просто использует htmlspecialchars() . Я ищу общие случаи, а не конкретные случаи, которые можно решать индивидуально.

Обычно я использую

 htmlspecialchars($var, ENT_QUOTES) 

по полям ввода. Я создал метод, который делает это, потому что я использую это много, и он делает код короче и читабельнее.

Давайте быстро рассмотрим, почему ускорение требуется в разных контекстах:

Если вы находитесь в строке с разделителями с кавычками, вам нужно уйти от котировок. Если вы находитесь в xml, вам нужно отделить «контент» от «разметки». Если вы находитесь в SQL, вам нужно отделить «команды» от «данных». Если вы находитесь в командной строке, вам нужно отделить «команды», из "данных"

Это действительно основной аспект вычислений в целом. Поскольку синтаксис, который ограничивает данные, может произойти В ДАННЫХ, должен быть способ дифференцировать DATA из SYNTAX, следовательно, экранировать.

В веб-программировании общие случаи экранирования: 1. Вывод текста в HTML 2. Вывод данных в атрибуты HTML 3. Вывод HTML в HTML 4. Вставка данных в Javascript 5. Вставка данных в SQL 6. Вставка данных в команду оболочки

Каждый из них имеет разные последствия для безопасности при неправильном обращении. ЭТО ДЕЙСТВИТЕЛЬНО ВАЖНО! Давайте рассмотрим это в контексте PHP:

  1. Текст в HTML: htmlspecialchars (…)

  2. Данные в атрибуты HTML htmlspecialchars (…, ENT_QUOTES)

  3. HTML в HTML Используйте библиотеку, такую ​​как HTMLPurifier, чтобы убедиться, что присутствуют только действительные теги.

  4. Данные в Javascript я предпочитаю json_encode . Если вы поместите его в атрибут, вам все равно нужно использовать # 2, например

  5. Вставка данных в SQL Каждый драйвер имеет некоторую функцию escape (). Это лучше. Если вы работаете в обычном наборе символов latin1, то подходит addlashes (…). Не забывайте цитаты ВОКРУГ вызова addlashes ():

    "INSERT INTO table1 SET field1 = '". addlashes ($ data). «'»

  6. Данные командной строки escapeshellarg () и escapeshellcmd () – прочитайте руководство

– Примите это близко к сердцу, и вы устраните 95% * общих рисков безопасности в Интернете! (* догадка)

Вы не должны очищать текст от вывода, это должно происходить на входе. Я использую фильтр, который фильтрует все входные данные приложения. Он настраивается так, что он может разрешать определенные теги / данные при необходимости (скажем, для редактора wysiwig).

Вы должны делать как можно меньше обработки текста на выходе, чтобы обеспечить скорость. Обработка его однажды создает намного меньше нагрузки, а затем обрабатывает ее 500,0000 раз.