Вы только запускаете 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:
Текст в HTML: htmlspecialchars(...)
Данные в атрибуты HTML htmlspecialchars (..., ENT_QUOTES)
HTML в HTML Используйте библиотеку, такую как HTMLPurifier, чтобы УБЕДИТЬСЯ, что присутствуют только допустимые теги.
Данные в Javascript я предпочитаю
json_encode
, Если вы помещаете его в атрибут, вам все равно нужно использовать #2, напримерВставка данных в SQL Каждый драйвер имеет функцию escape(). Это лучше. Если вы работаете в обычном латинском наборе символов, подойдут дополнительные черты (...). Не забудьте про кавычки Вокруг вызова addlashes():
"INSERT INTO table1 SET field1 = '". Аддлэш ($data) . "'"
Данные в командной строке escapeshellarg() и escapeshellcmd() - прочитайте руководство
- Примите это близко к сердцу, и вы устраните 95%* общих рисков веб-безопасности! (* догадка)
Вы не должны очищать текст при выводе, это должно происходить при вводе. Я использую фильтр, который фильтрует весь ввод в приложение. Он настраивается таким образом, чтобы при необходимости он мог пропускать определенные теги / данные (например, для редактора wysiwig).
Вы должны выполнять как можно меньше обработки текста на выходе, чтобы обеспечить скорость. Однократная его обработка создает намного меньшую нагрузку, чем 500,0000 раз.