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

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

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

3 ответа

Решение

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

htmlspecialchars($var, ENT_QUOTES) 

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

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

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

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

    "INSERT INTO table1 SET field1 = '". Аддлэш ($data) . "'"

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

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

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

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

Другие вопросы по тегам