1. Головна
  2. Колонка автора
  3. Фільтрування та перевірка даних в PHP

Фільтрування та перевірка даних в PHP

У значній більшості випадків мову РНР використовують для створення Wеb-додатків, що призводить до обов’язкового вивчення проблем безпеки. Програміст не може бути впевнений у доброзичливості користувачів, тому необхідно перевіряти всі вхідні дані, що надходять від них. РНР надає функції фільтрації та перевірки, за допомогою яких можна проконтролювати введену інформацію користувача.
Фільтрування та перевірка даних в PHP
При розробці програм існують два підходи для обробки даних, що надходять від користувача: фільтрація та перевірка введення на відповідність умові. Як приклад фільтрації можна навести типовий спосіб обробки GET параметра, наприклад цілісного ідентифікатора користувача 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, відповідних суперглобальним масивам, ключ параметра в суперглобальному масиві, який потрібно або перевірити на відповідність умовам, або фільтрувати і фільтр. Також можна передати асоціативний масив з додатковими параметрами, де вони необхідні.

#самовчитель_php
Редакція «КовельPost» може не поділяти думку блогерів або дописувачів. За зміст публікацій і їх достовірність відповідальність несуть автори.

Коментарі

Читайте також

Суперглобальні масиви в PHP

Суперглобальні масиви в PHP
Процес обміну за протоколом НТТР між браузером та сервером прихований від розробника та реалізується за допомогою автоматичних механізмів та інструментів – суперглобальних масивів.

Взаємодія РНР з HTML

Взаємодія РНР з HTML
Опишемо, як РНР взаємодіє з HTML і розглянемо два методи протоколу НТТР: GET – передача параметрів у рядку запиту та POST – передача параметрів у тілі НТТР-документа.

Підписуйтесь на наш канал у Telegram! 🚀

@kovelpost