ЛУЧШИЙ САЙТ ДЛЯ ВЕБ-РАЗРАБОТЧИКОВ

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. Уроки для начинающих

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


В этой и следующих главах показано, как использовать PHP для проверки данных формы.


PHP Проверка формы

Подумайте о БЕЗОПАСНОСТИ при обработке форм PHP!

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

HTML форма, над которой мы будем работать в этих главах, содержит различные поля ввода: обязательные и дополнительные текстовые поля, переключатели и кнопку отправки:

Правила валидации (проверки) для формы выше:

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

Сначала мы рассмотрим простой HTML-код формы:


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

Поля Имя, email и Веб-сайт являются элементами ввода текста, а поле комментария - текстовой областью. 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-код выглядит следующим образом:

Gender:
<input type="radio" name="gender" value="female">Female
<input type="radio" name="gender" value="male">Male
<input type="radio" name="gender" value="other">Other

Элемент form

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.html":

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

Теперь, если пользователь вводит нормальный URL-адрес в адресной строке, как "http://www.example.com/test_form.html", приведенный выше код будет переведен в:

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

Пока всё в порядке.

Однако учтите, что пользователь вводит следующий URL в адресную строку:

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

В этом случае приведенный выше код будет переведен на:

<form method="post" action="test_form.html/"><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.html/&quot;&gt;&lt;script&gt;alert('hacked')&lt;/script&gt;">

Попытка эксплойта не удалась, и никакого вреда нанесено не было!


Проверьте данные формы с помощью PHP

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

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

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

- это не будет выполнено, потому что оно будет сохранено как HTML-код, как этот:

&lt;script&gt;location.href('http://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, то форма была отправлена - и она должна быть проверена. Если она не была отправлена, пропустите проверку и отобразите пустую форму.

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

Следующим шагом является обязательное заполнение полей ввода и создание сообщений об ошибках, если это необходимо.