Фільтрація даних вбудованими фільтрами PHP

14

Від автора: При створенні сайтів або веб-додатків, так або інакше, необхідно фільтрувати дані, отримані від користувача. В першу чергу, це необхідно для забезпечення безпеки, а також для зберігання даних в правильному форматі. Для цього у версії 5.2 інтерпретатора мови PHP була додана секція фільтр, що дозволяє фільтрувати, так і очищати вхідні дані. Тому в даному уроці ми розглянемо функції, які дозволяють виконувати фільтрацію даних, а також безпосередньо доступні фільтри.

Фільтрація даних вбудованими фільтрами PHPФільтрація даних вбудованими фільтрами PHP

Функції для фільтрації

Насамперед хотів би зазначити, що для використання функцій фільтрів, Вам необхідний інтерпретатор мови PHP версії 5.2 та вище. Ознайомитись з офіційною документацією по вбудованим фільтрів можна за посиланням https://php.net/manual/ru/book.filter.php.

Фільтрація даних вбудованими фільтрами PHP

Почнемо з вивчення функції filter_list(), яка повертає масив імен доступних фільтрів.

В результаті ми отримаємо наступний масив:

Фільтрація даних вбудованими фільтрами PHP

Далі ми можемо отримати ідентифікатор цікавить фільтра, передавши його ім’я в функцію filter_id(), яка повертає ідентифікатор, що належить іменованого фільтру. Звичайно, всі ідентифікатори збережені в спеціальних константах, але якщо Ви забули ім’я константи, функція filter_id(), Вам дуже знадобиться. Наприклад, дізнаємося ідентифікатор фільтра number_int:

В результаті ми отримаємо число 519 – це відповідає значенню константи FILTER_SANITIZE_NUMBER_INT.

При фільтрації, постійно доводиться працювати з зовнішніми даними, тому спочатку необхідно перевірити, чи були вони передані. Зовнішні дані, передані в скрипт, зберігаються в одному з суперглобальних масивів, приміром $_POST, $_GET. Функція filter_has_var() — перевіряє існування змінної зазначеного типу, і повертає істину в разі успіху.

filter_has_var ( int $type , string $variable_name )

Де, $type – тип змінної, що дорівнює одній з наступних констант INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER (змінна з масиву $_POST, $_GET, $_COOKIE, $_SERVER відповідно), string $variable_name – ім’я змінної (осередку відповідного масиву).

Такі функції, які належить розглянути, працюють безпосередньо з фільтрами, тому пропоную вивчати їх разом.

Фільтри валідації даних

Для фільтрації значення змінної переданої з поза, використовується функція filter_input($type , $variable_name, $filter = FILTER_DEFAULT, $options), яка приймає зовнішню змінну і, при необхідності, фільтрує її. Аргументи функції:

$type – тип змінної (дорівнює значенню однієї з констант розглянутих вище);

$variable_name – ім’я цікавить змінної (осередок суперглобального масиву);

$filter – ідентифікатор фільтра.

$options – масив опцій, який може містити параметри і прапори, необхідні для налаштування фільтра. Для вказівки прапора, необхідно створити осередок flags, для вказівки параметрів – options.

Наприклад, створимо невелику форму:

В процесорі, відфільтруємо значення, яке передається через текстове поле string:

$options = array(
‘flags’=>»»,
«options»=>array(
)
);
if(filter_input(INPUT_POST,’string’,FILTER_VALIDATE_BOOLEAN,$options)) {
echo «YES»;
}
else {
echo «NO»;
}

Як Ви бачите я викликав на виконання функцію filter_input(), і передав третім параметром фільтр FILTER_VALIDATE_BOOLEAN, який повертає TRUE для значень «1», «true», «on» і «yes», інакше повертає FALSE. Відповідно якщо в формі ввести значення 1 – на екрані ми побачимо рядок YES. Якщо передати в масив
$options прапор FILTER_NULL_ON_FAILURE – фільтр буде повертати NULL замість FALSE.

Фільтр валідації email

FILTER_VALIDATE_EMAIL – фільтр повертає TRUE, якщо значення, яке перевіряється, є валідним email адресою.

$options = array(
‘flags’=>»FILTER_NULL_ON_FAILURE»,
«options»=>array(
)
);

Фільтр валідації числа з плаваючою точкою

FILTER_VALIDATE_FLOAT – фільтр повертає TRUE, якщо передане значення – це правильне число з плаваючою точкою. Даний фільтр підтримує один прапор FILTER_FLAG_ALLOW_THOUSAND, який дозволяє використання роздільників тисяч (за замовчуванням це).

Фільтр валідації цілочисельних значень

FILTER_VALIDATE_INT — Перевіряє, що значення є коректним цілим числом, і, при необхідності, входить у діапазон. Підтримує два прапора FILTER_FLAG_ALLOW_OCTAL і FILTER_FLAG_ALLOW_HEX, які дозволяють використання чисел вісімковій і шістнадцятковій, відповідно, систем числення. Крім цього, фільтр приймає два параметри, тобто діапазон чисел, який має задовольняти значення, яке перевіряється.

options = array(
‘flags’=>»»,
«options»=>array(
‘min_range’=>3,
‘max_range’=>10
)
);
if(filter_input(INPUT_POST,’string’,FILTER_VALIDATE_INT,$options)) {
echo «YES»;
}
else {
echo «NO»;
}

Якщо в текстову форму ввести число в діапазоні від 3 до 10, як результат ми отримаємо YES.

Фільтр валідації IP адреси

FILTER_VALIDATE_IP – повертає істину, якщо значення, яке перевіряється відповідає IP адресою. Підтримує наступні прапорці:

FILTER_FLAG_IPV4 – IP адреса має відповідати адресі формату IPV4;

FILTER_FLAG_IPV6 — IP адреса має відповідати адресі формату IPV6;

FILTER_FLAG_NO_PRIV_RANGE – адреса не повинен відповідати діапазону локальних адрес;

FILTER_FLAG_NO_RES_RANGE — забороняє успішне проходження перевірки для зарезервованих адрес.

Фільтр відповідності шаблону регулярного виразу

FILTER_VALIDATE_REGEXP – перевіряє, чи відповідає перевіряється значення шаблоном регулярного виразу, який переданий в масив $options (осередок ‘regexp’):

«»,
«options»=>array(
‘regexp’=>’/^[0-9_]*$/’
),
);
if(filter_input(INPUT_POST,’string’,FILTER_VALIDATE_REGEXP,$options)) {
echo «YES»;
}
else {
echo «NO»;
}
?>

В даному прикладі, перевірку пройде рядок, що складається лише з цифр.

Фільтр валідації URL

FILTER_VALIDATE_URL – перевіряє, чи відповідає рядок URL адресою. Підтримує два прапори: FILTER_FLAG_PATH_REQUIRED – URL, обов’язково повинен містити повний шлях (тобто разом з доменом сайту, має бути ім’я виконуваного файлу) і FILTER_FLAG_QUERY_REQUIRED – рядок URL, обов’язково повинна містити рядок GET параметрами.

З фільтрами валідації, ми закінчили, тепер давайте розглянемо ще одну функцію, яка дозволяє виконувати перевірку не однієї змінної, а цілого масиву.

filter_input_array ($type, $definition, $add_empty = true ) ;

Аргументи функції:

$type – тип досліджуваної змінної (дин з INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER);

$definition – масив, що визначає умови фільтрації.

Наприклад, якщо ми передаємо методом POST дві змінні – number і summ, то для валідації даних полів за допомогою функції filter_input_array(), необхідно:

/*$_POST = array(
[‘number’]=>5,
[‘summ’]=>10
);*/
$def = array(
‘number’ => FILTER_VALIDATE_INT,
‘summ’=>array(
‘filter’=>FILTER_VALIDATE_FLOAT,
‘flags’ => FILTER_FLAG_ALLOW_THOUSAND,
‘options’=>array()
)
);
var_dump(filter_input_array(INPUT_POST,$def));

Як Ви бачите, у функцію, першим параметром, ми передаємо константу INPUT_POST, тобто, очікуємо дані, які будуть відправлені запитом POST. А так само створюємо масив $def, кількість клітинок якого збігається з кількістю клітинок у масиві $_POST, до того ж імена клітинок так само співпадають з іменами масиві $_POST.

Фільтри очищення даних

Перед вивченням фільтрів цієї групи, вивчимо останні дві функції, фільтрації даних.

filter_var($variable,$filter, $options)

Функція filter_var() – фільтрує змінну за допомогою певного типу і повертає відфільтровані дані. Першим параметром необхідно передати ім’я змінної, яку потрібно відфільтрувати, другим – ідентифікатор фільтра, третім – масив опцій.

Наприклад, для фільтрації змінної $number = 5, необхідно виконати наступне (тобто ця змінна повинна містити тільки ціле число в діапазоні від 1 до 7):

«,
‘options’ => array(
‘min_range’=>3,
‘max_range’=>10
)
);
var_dump(filter_var($number,FILTER_VALIDATE_INT, $options));
?>

І друга функція — filter_var_array ($data, $definition, $add_empty), по своїй роботі повністю аналогічна функції filter_input_array(), за винятком того, що фільтрується масив змінних скрипта.

Фільтри очищення даних, виконують безпосередні маніпуляції з даними, а саме очищають дані по заданій умові.

Фільтр очищення email

FILTER_SANITIZE_EMAIL – видаляє символи, які неприпустимі в email адреси, а саме видаляє всі символи, крім букв, цифр і !#$%&’*+-/=?^_`{|}[email protected][]. Наприклад:

$email = ‘(admin(собака)admin.ru)’;
echo filter_var($email,FILTER_SANITIZE_EMAIL );

Фільтр кодування символів

FILTER_SANITIZE_ENCODED — кодує рядок у формат URL, а також при необхідності видаляє або кодує спеціальні символи.

Прапори: FILTER_FLAG_STRIP_LOW – видаляє символи ANCII код, яких менше 32, FILTER_FLAG_STRIP_HIGH – видаляє символи ANCII код, яких більше 122, FILTER_FLAG_ENCODE_LOW– кодує символи ANCII код, яких менше 32, FILTER_FLAG_ENCODE_HIGH – кодує символи ANCII код, яких більше 122.

Фільтр екранування лапок

FILTER_SANITIZE_MAGIC_QUOTES – при використанні даного фільтра викликається функція addslashes().

Фільтри очищення чисел

FILTER_SANITIZE_NUMBER_FLOAT – фільтрує числа з плаваючою точкою, а саме видаляє всі символи, крім цифр, +- і, при необхідності, .,eE. Підтримуються прапори: FILTER_FLAG_ALLOW_FRACTION – точка розділяє дробову і цілу частину не видаляється, FILTER_FLAG_ALLOW_THOUSAND – роздільник тисяч не видаляється FILTER_FLAG_ALLOW_SCIENTIFIC – символи eE – не видаляються.

FILTER_SANITIZE_NUMBER_INT — видаляє всі символи, крім цифр і знаків плюса і мінуса.

Фільтри очищення рядків

FILTER_SANITIZE_SPECIAL_CHARS – фільтр екранує HTML-символи ‘»& символи з ASCII-кодом, меншим 32, при використанні прапорів видаляє або кодує інші спеціальні символи. Підтримуються прапори: FILTER_FLAG_STRIP_LOW, FILTER_FLAG_STRIP_HIGH, FILTER_FLAG_ENCODE_HIGH.

FILTER_SANITIZE_FULL_SPECIAL_CHARS – повністю аналогічний роботі функції htmlspecialchars(). Для відключення кодування лапок, необхідно використовувати прапор FILTER_FLAG_NO_ENCODE_QUOTES.

FILTER_SANITIZE_STRING – фільтр видаляє і при використанні прапорів, видаляє або кодує спеціальні символи. Підтримує наступні прапорці: FILTER_FLAG_NO_ENCODE_QUOTES, FILTER_FLAG_STRIP_LOW, FILTER_FLAG_STRIP_HIGH, FILTER_FLAG_ENCODE_LOW, FILTER_FLAG_ENCODE_HIGH, FILTER_FLAG_ENCODE_AMP. Останній прапор екранує знак &.
FILTER_SANITIZE_URL – фільтр всі символи, які можна використовувати в URL, тобто всі символи, крім букв, цифр і $-_.+!*'(),{}|\\^~[]`#%»;/?:@&=.

Ось власне і все, що я хотів Вам сказати на даному уроці. Всього Вам доброго і вдалого кодування і до нових коштів!!!