Стоп!
Вы делаете ошибку здесь.О, нет, вы выбрали правильные функции PHP, чтобы сделать ваши данные немного безопаснее.Все в порядке.Ваша ошибка в порядке операций , а также о том, как и где использовать эти функции.
Важно понимать разницу между очисткой и проверкой пользовательских данных, экранированием данных для хранения и экранированием.данные для представления.
Санитарная обработка и проверка данных пользователя
Когда пользователи отправляют данные, вы должны убедиться, что они предоставили то, что вы ожидаете.
Очистка и фильтрация
Например, если вы ожидаете число, убедитесь, что представленные данные являются числом .Вы также можете преобразовывать пользовательские данные в другие типы.Все представленное вначале обрабатывается как строка, поэтому преобразование известных числовых данных в целое число или число с плавающей точкой делает очистку быстрой и безболезненной.
А как насчет текстовых полей и текстовых полей произвольной формы?Вы должны убедиться, что в этих полях нет ничего неожиданного.Главным образом, вам нужно убедиться, что поля, которые не должны содержать никакого HTML-контента, на самом деле не содержат HTML.Есть два способа решения этой проблемы.
Во-первых, вы можете попробовать избежать ввода HTML с htmlspecialchars
.Вы не должны использовать htmlentities
для нейтрализации HTML, так как он также будет выполнять кодирование акцентированных и других символов, которые, по его мнению, также необходимо кодировать.
Во-вторых, вы можете попробовать удаление любого возможного HTML.strip_tags
быстро и легко, но также небрежно. Очиститель HTML выполняет гораздо более тщательную работу по удалению всего HTML, а также разрешает выборочный белый список тегов и атрибутов.
Современные версии PHP поставляются с расширением фильтра , который обеспечивает комплексный способ дезинфекции ввода пользователя.
Проверка
Убедиться, что представленные данные не содержат неожиданного содержимого, - это только половина работы.Вы также должны попытаться убедиться, что представленные данные содержат значения, с которыми вы действительно можете работать.
Если вы ожидаете число от 1 до 10, вам нужно проверить это значение.Если вы используете один из этих новых причудливых числовых вводов эпохи HTML5 со счетчиком и шагами, убедитесь, что представленные данные соответствуют шагу.
Если эти данные получены из того, что должно быть отбрасыванием-Внизу меню убедитесь, что представленное значение является тем, которое появилось в меню.
А как насчет ввода текста, который отвечает другим потребностям?Например, ввод даты должен быть проверен с помощью strtotime
или DateTime класса .Данная дата должна быть между ожидаемыми диапазонами.А как насчет адресов электронной почты?Ранее упомянутое расширение фильтра может проверить, правильно ли сформирован адрес, хотя я фанат библиотеки is_email .
То же самое верно для все другие элементы управления формой.Есть радио кнопки?Проверить по списку.Есть флажки?Проверить по списку.Есть загрузка файла?Убедитесь, что файл имеет ожидаемый тип, и рассматривайте имя файла как нефильтрованные пользовательские данные.
Каждый современный браузер поставляется с полным набором встроенных инструментов разработчика, что упрощает манипулирование вашей формой., Ваш код должен предполагать, что пользователь полностью снял все ограничения на стороне клиента для содержимого формы !
Удаление данных для хранения
Теперь, когда вы убедились, что вашДанные находятся в ожидаемом формате и содержат только ожидаемые значения, вам нужно беспокоиться о сохранении этих данных в хранилище.
У каждого механизма хранения данных есть особый способ убедиться, что данные правильно экранированы и закодированы.Если вы строите SQL, то принятый способ передачи данных в запросах - через подготовленные операторы с заполнителями .
Одним из лучших способов работы с большинством баз данных SQL в PHP является расширение PDO . Он следует общей схеме подготовки оператора , связывания переменных с оператором , затем отправки оператора и переменных на сервер . Если вы не работали с PDO до , вот довольно хороший MySQL-ориентированный учебник .
Некоторые базы данных SQL имеют свои собственные специальные расширения в PHP, включая SQL Server , PostgreSQL и SQLite 3 . Каждое из этих расширений имеет подготовленную поддержку операторов, которая работает так же, как и PDO. Иногда вам может понадобиться использовать эти расширения вместо PDO для поддержки нестандартных функций или поведения.
MySQL также имеет свои собственные расширения PHP. На самом деле два из них. Вы хотите использовать только тот, который называется mysqli . Старое расширение «mysql» было устарело и не является безопасным или вменяемым для использования в современную эпоху.
Лично я не фанат mysqli. То, как он выполняет привязку переменных к подготовленным операторам, негибко и может быть неудобно в использовании. Если есть сомнения, используйте вместо этого PDO.
Если вы не используете базу данных SQL для хранения своих данных, проверьте документацию для интерфейса базы данных, который вы используете, чтобы определить, как безопасно передавать данные через нее.
По возможности, убедитесь, что ваша база данных хранит ваши данные в соответствующем формате. Хранить номера в числовых полях. Храните даты в полях даты. Храните деньги в десятичном поле, а не в поле с плавающей запятой. Просмотрите документацию, предоставленную вашей базой данных о том, как правильно хранить различные типы данных.
Выход данных для презентации
Каждый раз, когда вы показываете данные пользователям, вы должны убедиться, что данные безопасно экранированы, если только вы не знаете , что их нельзя экранировать.
При испускании HTML вы почти всегда должны передавать любые данные, которые изначально были предоставлены пользователем через htmlspecialchars
. Фактически, единственный раз, когда вы не должны этого делать, это когда вы знаете , что пользователь предоставил HTML, и что вы знаете , что он уже обработан с использованием белого списка.
Иногда вам нужно сгенерировать Javascript, используя PHP. Javascript не имеет тех же правил экранирования, что и HTML! Безопасный способ предоставления пользовательских значений в Javascript через PHP - через json_encode
.
И еще
В проверке данных есть еще много нюансов.
Например, кодировка набора символов может быть огромной ловушкой . Ваша заявка должна следовать правилам, изложенным в « UTF-8, вплоть до ». Есть гипотетические атаки, которые могут произойти, когда вы обрабатываете строковые данные как неправильный набор символов.
Ранее я упоминал инструменты отладки браузера. Эти инструменты также могут быть использованы для управления данными cookie. Куки должны рассматриваться как ненадежный пользовательский ввод .
Проверка данных и экранирование - это только один аспект безопасности веб-приложения. Вам следует ознакомиться с методологиями атак веб-приложений , чтобы вы могли создать защиту против них.