Від автора: При створенні сайтів або веб-додатків, так або інакше, необхідно фільтрувати дані, отримані від користувача. В першу чергу, це необхідно для забезпечення безпеки, а також для зберігання даних в правильному форматі. Для цього у версії 5.2 інтерпретатора мови PHP була додана секція фільтр, що дозволяє фільтрувати, так і очищати вхідні дані. Тому в даному уроці ми розглянемо функції, які дозволяють виконувати фільтрацію даних, а також безпосередньо доступні фільтри.
Функції для фільтрації
Насамперед хотів би зазначити, що для використання функцій фільтрів, Вам необхідний інтерпретатор мови PHP версії 5.2 та вище. Ознайомитись з офіційною документацією по вбудованим фільтрів можна за посиланням https://php.net/manual/ru/book.filter.php.
Почнемо з вивчення функції filter_list(), яка повертає масив імен доступних фільтрів.
В результаті ми отримаємо наступний масив:
Далі ми можемо отримати ідентифікатор цікавить фільтра, передавши його ім’я в функцію 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, тобто всі символи, крім букв, цифр і $-_.+!*'(),{}|\\^~[]`#%»;/?:@&=.
Ось власне і все, що я хотів Вам сказати на даному уроці. Всього Вам доброго і вдалого кодування і до нових коштів!!!