ProfiPHPProfiPHP
  1. Главная
  2. Самоучитель PHP 7
  3. Фильтрация и проверка данных

Фильтрация и проверка данных

В значительном большинстве случаев язык РНР используют для создания Wеb-приложений, что приводит к обязательному изучению проблем безопасности. Программист не может быть уверен в доброжелательности пользователей, поэтому необходимо проверять все входящие от них данные. РНР предоставляет функции фильтрации и проверки, при помощи которых можно проконтролировать пользовательский ввод.

При разработке приложений существуют два подхода для обработки данных, поступающих от пользователя: фильтрация и проверка ввода на соответствие. В качестве примера фильтрации можно привести типичный способ обработки GЕТ параметра, например, целочисленного идентификатора пользователя Id. Для того чтобы гарантировать, что $_GET['id'] содержит число, а не строку, мы можем явно преобразовать ее целому числу:
$id = intval($_GET['id'])
Данный процесс отбрасывания всех несоответствующих данных называется фильтрацией или очисткой данных (sanitize). Также для фильтрации данных используются функции Htmlspecialchars и Strip_tags.

Иногда необходимо проверить пользовательские данные, например, являются ли они числом. Для этого можно воспользоваться следующим решением:
if (!is_int($_GET['id'])) exit('Идентификатор должен быть числом'); 
Данный процесс явной проверки значение на соответствие называется проверкой (validate). Как правило, проверке данные подвергаются на этапе ввода их пользователем, например, через НТМL-форму, а фильтрации - при выводе на страницу.

Для фильтрации переменных с помощью определенного фильтра существует функция Filter_var, которая принимает значение и фильтрует его в соответствии с правилом. Если переменная успешно проходит проверку, функция возвращает ее в качестве результата, в противном случае возвращается False.

Приведем пример проверки двух электронных адресов:
<?php
$correct = 'example@gmail.com';
$wrong = 'example@//gmail.com';
echo 'Правильный = '.filter_var($correct, FILTER_VALIDATE_EMAIL);
echo 'Неправильный = '.filter_var($wrong, FILTER_VALIDATE_EMAIL);
Следует осторожно использовать функцию Filter_var, поскольку она не корректно работает с кириллическими доменными именами.

Результатом работы примера будет успешный вывод значение корректного адреса и False для адреса, с двумя // слешами в доменном имени.

Функции Filter_var в качестве правила была передана константа FILTER_VALIDATE_EMAIL, ответственная за проверку электронного адреса. Все константы, которые может принимать функция Filter_var - парные: одна отвечает за проверку, другая - за фильтрацию. Для того чтобы удалить из электронного адреса все нежелательные символы, можно воспользоваться константой FILTER_SANITIZE_EMAIL:
<?php
echo filter_var($correct, FILTER_SANITIZE_EMAIL);
Результатом работы скрипта будет удаление всех некорректных символов из электронного адреса.

Электронный адрес - далеко не единственный тип данных, которые может проверять и фильтровать данная функция. Также возможно проверять значения типа Boolean, Float, Int, Ip адресса, URL и другие данные.

Фильтры очистки данных (sanitize) используются уже при выводе данных на страницу и осуществляют операции удаления определенных символов и тегов, кодирования строки в формат URL, экранирования НТМL-символов и других операциях.

Функция Filter_var допускает создание собственных механизмов проверки. Для активации этого режима в качестве фильтра следует использовать FILTER_CALLBACK. В параметрах Options следует передать имя функции, которая будет выполнять фильтрацию. Приведем пример, который очищает строку от НТМL-тегов при помощи функции Strip_tags:
<?php
function filterTags($value) {
return strip_tags($value);
}
$str = '<h1>Заголовок</h1>
<p>Первый параграф</p>';
echo filter_var($str, FILTER_CALLBACK, ['options' => 'filterTags']);
Результатом работы программы будут строки, в которых удалены все теги.

Необязательно определять отдельную функцию обратного вызова, особенно если она больше нигде не будет использоваться. В примере выше вместо функции обратного вызова FilterTags можно воспользоваться анонимной функцией:
<?php
function filterTags($value) {
return strip_tags($value);
}
$str = '<h1>Заголовок</h1>
<p>Первый параграф</p>';
echo filter_var($str, FILTER_CALLBACK,
[
'options' => function ($value) {
return strip_tags($value);
}
]
);

Фильтрация внешних данных


Внешние данные приходят в скрипт через один из суперглобальных массивов: $_GET - данные, поступившие через метод GET; $_POST - данные, поступившие через метод POST; $_COOKIE - данные, поступившие из COOKIE; $_SERVER - данные установленные Wеb-сервером; $_ENV - переменные окружения, установленные процессу Wеb-сервером. Помимо этого списка, приходится иметь дело с дополнительными суперглобальными массивами: $_FILES - загруженные на сервер файлы; $_SESSION - данные сессии; $_REQUEST - объединение всех перечисленных выше данных.

Для фильтрации данных из суперглобальных массивов предназначена специальная функция Filter_input, которая принимает в качестве параметра одну из констант INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV, соответствующих суперглобальным массивам, ключ параметра в суперглобальном массиве, который нужно либо проверить на соответствие условиям, либо отфильтровать и фильтр. Также можно передать ассоциативный массив с дополнительными параметрами, там, где они необходимы.

Добавить комментарий

Имя:
Текст комментария: