PHP Валидация (проверка) формы
В этой и следующих главах показано, как использовать PHP для проверки данных формы.
PHP Проверка формы
Подумайте о БЕЗОПАСНОСТИ при обработке форм PHP!
На этих страницах будет показано, как обрабатывать формы PHP с учетом требований безопасности. Надлежащая проверка данных формы важна для защиты вашей формы от хакеров и спамеров!
HTML форма, над которой мы будем работать в этих главах, содержит различные поля ввода: обязательные и дополнительные текстовые поля, переключатели и кнопку отправки:
Правила валидации (проверки) для формы выше:
Поле | Правила валидации |
---|---|
Имя | Обязательно. + Должно содержать только буквы и пробелы |
Обязательно. + Должно содержать действительный адрес электронной почты (с @ 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 символы, такие как < и > с помощью < и >. Это предотвращает использование кода злоумышленниками путем внедрения кода 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/"><script>alert('hacked')</script>">
Попытка эксплойта не удалась, и никакого вреда нанесено не было!
Проверьте данные формы с помощью PHP
Первое, что мы сделаем, это передадим все переменные через PHP функцию htmlspecialchars().
Когда мы используем функцию htmlspecialchars(); затем, если пользователь пытается отправить следующее в текстовом поле:
<script>location.href('http://www.hacked.com')</script>
- это не будет выполнено, потому что оно будет сохранено как HTML-код, как этот:
<script>location.href('http://www.hacked.com')</script>
Код теперь безопасен для отображения на странице или внутри электронной почты.
Мы также сделаем ещё две вещи, когда пользователь отправит форму:
- Убрать ненужные символы (лишний пробел, табуляцию, символ новой строки) из введенных пользователем данных (с помощью PHP функции trim())
- Удалить обратную косую черту (\) из введенных пользователем данных (с помощью 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, то форма была отправлена - и она должна быть проверена. Если она не была отправлена, пропустите проверку и отобразите пустую форму.
Однако в приведенном выше примере все поля ввода являются необязательными. Скрипт работает нормально, даже если пользователь не вводит никаких данных.
Следующим шагом является обязательное заполнение полей ввода и создание сообщений об ошибках, если это необходимо.