НАЙКРАЩИЙ САЙТ ДЛЯ ВЕБ-РОЗРОБНИКІВ

PHP Підручник

PHP СТАРТ PHP Інтро PHP Встановлення PHP Синтаксис PHP Коментарі PHP Змінні PHP Echo / Print PHP Типи даних PHP Рядки PHP Числа PHP Математика PHP Константи PHP Оператори PHP If...Else...Elseif PHP Switch PHP Цикли PHP Функції PHP Масиви PHP Суперглобали PHP RegEx

PHP Форми

PHP Обробка форми PHP Перевірка форми PHP Обов'язкові поля форми PHP Форма URL/E-mail PHP Заповнення форми

PHP Розширений

PHP Дата і час PHP Підключення файлів PHP Обробка файлів PHP Файл відкрити/читати PHP Файл створити/записати PHP Файл Завантажити PHP Кукі PHP Сесії PHP Фільтри PHP Розширені фільтри PHP Callback функції PHP JSON PHP Винятки

PHP ООП

PHP Що таке ООП PHP класи/об'єкти PHP Конструктор PHP Деструктор PHP Модифікатори доступу PHP Спадкування PHP Константи PHP Абстрактні класи PHP Інтерфейси PHP Трейти PHP Статичні методи PHP Статичні властивості PHP Простори імен PHP Ітерабелі

MySQL База даних

MySQL База даних MySQL Підключення MySQL Створити БД MySQL Створити таблиці MySQL Вставити дані MySQL Отримати останній ID MySQL Вставити кілька записів MySQL Підготовлені інструкції MySQL Вибрати дані MySQL Where MySQL Order By MySQL Видалення даних MySQL Оновлення даних MySQL Обмеження даних

PHP XML

PHP XML Парсери PHP SimpleXML Парсер PHP SimpleXML - Get PHP XML Expat PHP XML DOM

PHP - AJAX

AJAX Інтро AJAX PHP AJAX База даних AJAX XML AJAX Живий пошук AJAX Опитування

PHP Приклади

PHP Приклади PHP Компілятор PHP Вікторина PHP Вправи PHP Сертифікат

PHP Довідник

PHP Огляд PHP Масив PHP Календар PHP Дата PHP Каталог PHP Помилка PHP Виняток PHP Файлова система PHP Фільтр PHP FTP PHP JSON PHP Ключові слова PHP Libxml PHP Пошта PHP Математика PHP Різне PHP MySQLi PHP Мережа PHP Output Control PHP RegEx PHP SimpleXML PHP Потік PHP Рядок PHP Обробка змінних PHP XML Парсер PHP Zip PHP Часові пояси

PHP. W3Schools українською. Уроки для початківців

En

PHP Перевірка форми


Цей і наступні розділи показують, як використовувати PHP для перевірки даних форми.


PHP Перевірка форми

Думайте про БЕЗПЕКУ під час обробки PHP-форм!

На цих сторінках буде показано, як обробляти форми PHP з урахуванням безпеки. Належна перевірка даних форми важлива для захисту вашої форми від хакерів і спамерів!

HTML-форма, над якою ми працюватимемо в цих розділах, містить різні поля введення: обов’язкові та необов’язкові текстові поля, перемикачі та кнопку надсилання:

Правила перевірки для форми вище є такими:

Поле Правила перевірки
Ім’я Обов’язково. + Має містити лише літери та пробіли
E-mail Обов’язково. + Має містити дійсну електронну адресу (з @ та .)
Вебсайт Не обов’язково. Якщо він присутній, він має містити дійсну URL-адресу
Коментар Не обов’язково. Багаторядкове поле введення (textarea)
Стать Обов’язково. Потрібно вибрати один варіант

Спочатку ми розглянемо звичайний HTML-код для форми:


Текстові поля

Поля імені, електронної пошти та вебсайту є елементами введення тексту, а поле коментаря є текстовим полем. HTML-код виглядає так:

Ім’я: <input type="text" name="name">
E-mail: <input type="text" name="email">
Вебсайт: <input type="text" name="website">
Коментар: <textarea name="comment" rows="5" cols="40"></textarea>

Радіо кнопки

Поля статі є перемикачами, а HTML-код виглядає так:

Стать:
<input type="radio" name="gender" value="female">Жінка
<input type="radio" name="gender" value="male">Чоловік
<input type="radio" name="gender" value="other">Щось середнє

Елементи форми

HTML-код форми виглядає так:

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

Коли форма надсилається, дані форми надсилаються за допомогою method="post".

Що таке змінна $_SERVER["PHP_SELF"]?

$_SERVER["PHP_SELF"] — це суперглобальна змінна, яка повертає ім’я файлу скрипту, що зараз виконується.

Отже, $_SERVER["PHP_SELF"] надсилає надіслані дані форми на саму сторінку, замість переходу на іншу сторінку. Таким чином, користувач отримуватиме повідомлення про помилки на тій же сторінці, що й форма.

Що таке функція htmlspecialchars()?

Функція htmlspecialchars() перетворює спеціальні символи на об’єкти HTML. Це означає, що він замінить такі символи HTML, як < та > з &lt; та &gt;. Це запобігає зловмисникам від використання коду, вставляючи код HTML або Javascript (атаки міжсайтового скриптінгу) у форми.


Важлива примітка щодо безпеки форм PHP

Змінна $_SERVER["PHP_SELF"] може бути використана хакерами!

Якщо на вашій сторінці використовується PHP_SELF, то користувач може ввести слеш (/) і потім якусь команду кроссайтового скриптингу (XSS) для виконання.

Cross-site scripting / Кроссайтовий скриптинг (XSS) - це тип вразливості комп’ютерної безпеки, як правило, зустрічається у вебдодатках. XSS дозволяє зловмисникам вводити скрипт на стороні клієнта на вебсторінки, які переглядаються іншими користувачами.

Припустимо, у нас є така форма на сторінці "test_form.php":

<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">

Тепер, якщо користувач вводить звичайну URL-адресу в адресному рядку, наприклад, "https://www.example.com/test_form.php", наведений вище код буде перекладений на:

<form method="post" action="test_form.php">

Поки що все добре.

Однак, подумайте, що користувач вводить наступну URL-адресу в адресному рядку:

https://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E

У цьому випадку наведений вище код буде перекладений на:

<form method="post" action="test_form.php/"><script>alert('hacked')</script>

Цей код додає тег script та команду alert (оповіщення). І коли сторінка завантажується, код JavaScript буде виконаний (користувач побачить поле оповіщення). Це просто простий і нешкідливий приклад того, як можна використовувати змінну PHP_SELF.

Будьте в курсі того, що будь-який JavaScript код можна додати всередині тегу <script>! Хакер може перенаправити користувача на файл на іншому сервері, і цей файл може містити шкідливий код, який може змінити глобальні змінні або подати форму на іншу адресу, щоб зберегти дані користувача, наприклад.

Круто, еге ж?


Як уникнути експлуатації $_SERVER["PHP_SELF"]?

Експлуатацію $_SERVER["PHP_SELF"] можна уникнути за допомогою функції htmlspecialchars().

Код форми повинен виглядати так:

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

Функція htmlspecialchars() перетворює спеціальні символи в об’єкти HTML. Тепер, якщо користувач намагається використовувати змінну PHP_SELF, це призведе до наступного виведення:

<form method="post" action="test_form.php/&quot;&gt;&lt;script&gt;alert('hacked')&lt;/script&gt;">

Спроба експлуатації не вдається, і ніякої шкоди не робиться!


Перевірити дані форми за допомогою PHP

Перше, що ми зробимо, це передамо всі змінні через PHP функцію htmlspecialchars().

Коли ми використовуємо функцію htmlspecialchars(); тоді, якщо користувач намагається надіслати наступне в текстове поле:

<script>location.href('https://www.hacked.com')</script>

- це не буде виконано, оскільки буде збережено як екранований код HTML, як це:

&lt;script&gt;location.href('https://www.hacked.com')&lt;/script&gt;

Тепер код можна безпечно відображати на сторінці або в електронному листі.

Ми також зробимо ще дві речі, коли користувач надішле форму:

  1. Видаліть непотрібні символи (зайвий пробіл, табуляцію, новий рядок) із введених користувачем даних (за допомогою PHP функції trim())
  2. Видаліть зворотні косі риски (\) із введених користувачем даних (за допомогою PHP функції stripslashes())

Наступним кроком є створення функції, яка виконуватиме всю перевірку за нас (що набагато зручніше, ніж писати той самий код знову і знову).

Ми назвемо функцію test_input().

Тепер ми можемо перевірити кожну змінну $_POST за допомогою функції test_input(), і скрипт буде виглядати так:

Приклад

<?php
// визначте змінні та встановіть порожні значення
$name = $email = $gender = $comment = $website = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  $name = test_input($_POST["name"]);
  $email = test_input($_POST["email"]);
  $website = test_input($_POST["website"]);
  $comment = test_input($_POST["comment"]);
  $gender = test_input($_POST["gender"]);
}

function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}
?>
Виконати приклад »

Зауважте, що на початку скрипту ми перевіряємо, чи надіслано форму за допомогою $_SERVER["REQUEST_METHOD"]. Якщо REQUEST_METHOD має значення POST, це означає, що форму надіслано, і її потрібно перевірити. Якщо його не було надіслано, пропустіть перевірку та відобразіть порожню форму.

Однак у наведеному вище прикладі всі поля введення необов’язкові. Скрипт працює нормально, навіть якщо користувач не вводить жодних даних.

Наступним кроком буде зробити поля введення обов’язковими та за потреби створити повідомлення про помилки.