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

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

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

Ответы [ 3 ]

10 голосов
/ 09 февраля 2009

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

htmlspecialchars($var, ENT_QUOTES) 

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

7 голосов
/ 09 февраля 2009

Давайте кратко рассмотрим ПОЧЕМУ экранирование необходимо в разных контекстах:

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

Это действительно базовый аспект вычислений в целом. Поскольку синтаксис, который разделяет данные, может встречаться в ДАННЫХ, должен быть способ отличить ДАННЫЕ от СИНТАКСА, следовательно, экранировать.

В веб-программировании наиболее распространенными примерами экранирования являются: 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 (). Это лучше. Если вы работаете в обычном латинском наборе символов, подходит добавочная черта (...). Не забудьте про кавычки Вокруг вызова addlashes ():

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

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

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

0 голосов
/ 10 февраля 2009

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

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

...