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 Обязательные поля Валидация URL/E-mail Полная форма PHP

PHP Продвинутый

PHP Дата и время PHP Include/Require PHP Работа с файлами Открытие/Чтение файлов Создание/Запись файлов PHP Загрузка файлов Файлы cookie PHP Сессии PHP Фильтры PHP Расширенные фильтры PHP Функция Callback PHP JSON PHP Исключения

PHP OOP

Что такое ООП в PHP Классы/Объекты PHP Цепочки методов PHP Конструктор PHP Деструктор PHP Модификаторы доступа Наследование в PHP Константы класса PHP Подсказка типов PHP Подсказка интерфейсов Абстрактные классы PHP PHP Интерфейсы PHP Полиформизм PHP Трейты Статические методы PHP Статические свойства PHP Пространства имен PHP Итерируемые объекты

База данных MySQL

База данных MySQL Подключение к MySQL Создание БД MySQL Создание таблицы MySQL Вставка данных MySQL Получить ID MySQL Подготовленные операторы PHP MySQL Получение данных MySQL Предложение WHERE Предложение ORDER BY Обновление данных MySQL Удаление данных БД MySQL Limit Data

PHP XML

Парсеры PHP XML Парсер PHP SimpleXML Получить PHP SimpleXML PHP XML Expat PHP XML DOM

PHP - AJAX

AJAX Введение AJAX PHP AJAX База Данных AJAX XML AJAX Живой поиск AJAX Опрос

PHP Примеры

PHP Примеры Практика ООП PHP PHP квиз-тест Упражнения Базовый PHP Упражнения Алгоритмы Упражнения Массивы Упражнения Цикл for Упражнения Функции Регулярные выражения Упражнения Дата PHP Упражнения Строки PHP Математика PHP Упражнения Формы PHP Упражнения Классы PHP Упражнения JSON PHP PHP Задачник


Проверка (валидация) форм PHP




В этой главе будет показано, как обрабатывать формы PHP с учетом требований безопасности. Правильная валидация данных формы важна для её защиты от хакеров и спамеров!


Валидация означает проверку данных, вводимых пользователем. В PHP доступны два типа проверки:

  • Валидация на стороне клиента — проверка выполняется на стороне клиента в веб-браузере.

  • Валидация на стороне сервера — после отправки данных на сервер их проверка осуществляется на серверной стороне.

Ниже приведена HTML-форма, которая содержит различные поля ввода: обязательные (required) и необязательные текстовые поля, переключатели (радио-кнопки) и кнопку отправки (submit). С этой формой мы будем с вами работать в этой главе. Попробуйте ввести данные:

Некоторые из правил проверки нашей формы:

Поле формы Правила валидации
Имя Обязатеьно для заполнения + Должно содержать только буквы и пробелы
E-mail Обязатеьно для заполнения + Требуются символ собачка (@) и точка (.)
Веб-сайт Необязательно для заполнения. Проверяется наличие валидного URL
Комментарий Необязательно для заполнения. Многострочное поле ввода (текстовое поле)
Образование Обязатеьно для заполнения + Должна быть выбрана хотя бы одна кнопка

Поля для ввода имени, адреса электронной почты и веб-сайта создается с помощью элемента <input> (от англ. input — ввод) с атрибутом type="text", а поле для комментария применяется элемент <textarea> (текстовая область). 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>

В нашей форме выбор образования осуществляется с помощью элементов <input> типа radio (переключатели), которые используют принцип логического «ИЛИ», позволяя выбрать только одно из нескольких значений: если вы выбираете одно положение, то все остальные становятся неактивными:

<input type="radio" name="education" value="Институт">Институт
<input type="radio" name="education" value="Техникум">Техникум
<input type="radio" name="education" value="Другое"Другое>

Главным для элемента <form> является атрибут action, который указывает обработчик данных для формы. Обработчик данных — это файл, описывающий, что нужно делать с данными формы. Данные формы отправляются с помощью method = "post":

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

$_SERVER ["PHP_SELF"] — это суперглобальная переменная, которая возвращает имя файла текущего выполняемого скрипта-обработчика.

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

Функция htmlspecialchars() преобразует данные, введенные пользователем, которые могут содержать нежелательные HTML-тэги. Производятся следующие преобразования:

  • '&' (амперсанд) преобразуется в '&amp;'

  • '<' (знак "меньше чем") преобразуется в '&lt;'

  • '>' (знак "больше чем") преобразуется в '&gt;'

Эти манипуляции предотвращает использование злоумышленниками кода путем внедрения скрипта (атаки с межсайтовым скриптингом) в формы.

Учтите, что переменная $_SERVER ["PHP_SELF"] может использоваться хакерами!

Если Вы используете на странице сайта PHP_SELF, то пользователь может ввести в адресной строке косую черту (/), а затем выполнить несколько команд межсайтового скриптинга (XSS).

Примечание: XSS (англ. Cross-Site Scripting — «межсайтовый скриптинг») — тип атаки на веб-системы, заключающийся во внедрении в выдаваемую веб-системой страницу вредоносного кода (который будет выполнен на компьютере пользователя при открытии им этой страницы) и взаимодействии этого кода с веб-сервером злоумышленника. XSS позволяет злоумышленникам внедрять клиентские скрипты в веб-страницы, просматриваемые другими пользователями..

Предположим, у нас есть следующая форма на странице с именем "send_form.php":

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

Теперь, если пользователь вводит обычный URL-адрес в адресной строке, например «http://site_name.com/send_form.php», приведенный выше код будет преобразован в:

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

Теперь пользователь вводит URL-адрес в адресной строке и после косой черты несколько команд межсайтового скриптинга:

http://site_name.com/send_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E

После таких манипуляция приведенный выше код будет переведен на:

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

Этот код добавляет тег скрипта и команду предупреждения alert. Когда страница начнёт загружаться, код JavaScript будет выполнен и пользователь увидит окно предупреждения. Дальнейшая загрузка страницы прекратится до тех пор, пока пользователь не кликнет ОК. Это простой пример того, как можно использовать переменную PHP_SELF.

Примечание: Имейте в виду, что любой код JavaScript можно внедрить внутрь тега ><script">! Хакер может перенаправить посетителя сайта к файлу на другом сервере, а тот файл может содержать вредоносный код. Этот код, в свою очередь, может изменять глобальные переменные или пренаправлять данные формы на другой адрес, например, для кражи пользовательской информации.

Экспло́йт (англ. exploit, эксплуатировать) — это фрагмент вредоносного программного кода либо последовательность команд, которые используют уязвимости в программе и применяеются для проведения хакерской атаки.

Чтобы избежать экспойты нужно переменную $_SERVER["PHP_SELF"] предать в качестве аргумента в функцию htmlspecialchars():

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

Функция htmlspecialchars() преобразует специальные символы (в нашем случае угловые скобки < и >) в объекты HTML. Теперь, если пользователь попытается использовать переменную PHP_SELF с целью внедрения стороннего кода, это приведет к следующему выводу:

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

Попытка эксплойта в этом случае не удастся и никакой вредоносный код не сработает.

Первым делом передадим все переменные формы в функцию PHP htmlspecialchars(). Эта функция возвращает строку, над которой проведены рассмотренные выше преобразования. Этих преобразований достаточно для защиты от эксплойта.

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

Сдедующим шагом применим ещё две функции:

  1. Из данных, вводимых пользователем (с помощью PHP функции trim()) удалим ненужные символы (лишние пробелы, табуляции, переходы на новую строку)
  2. C помощью PHP функции stripslashes() из данных, вводимых пользователем, удалим обратную косую черту (\)

И, наконец, создадим функцию, которая будет выполнять все рассмтренные проверки за нас, что намного удобнее, чем писать один и тот же код снова и снова. Назовем функцию test_input().

В следующем примере будем проверять каждую переменную $_POST с помощью функции test_input():

<?php
//определим переменные и установим пустые значения
$name = $email = $education = $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"]);
  $education = test_input($_POST["education"]);
} function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
} ?>

В начале сценария мы проверяем, используя суперглобальную переменную $ _SERVER ["REQUEST_METHOD"], была ли отправлена ​​форма. Если для запроса страницы был использован метод POST, значит, форма была отправлена ​​— и ее нужно проверить. Если форма не была отправлена — пропускаем проверку и отображаем пустую форму.

В приведенном выше примере все поля ввода необязательны. Созданный в этом уроке скрипт отлично работает, даже если пользователь не вводит никаких данных.

В следующем уроке сделаем поля ввода обязательными, а также разберёмся как, при необходимости, создать сообщения об ошибках.