PHP 5 Form Validation
В этой и следующих главах показано, как использовать PHP для проверки данных формы.
Проверка формы PHP
Подумайте безопасности при обработке PHP форм!
На этих страницах будет показано, как обрабатывать PHP-формы с учетом безопасности. Правильная проверка данных формы важна для защиты вашей формы от хакеров и спамеров!
HTML-форма, в которой мы будем работать в этих главах, содержит различные поля ввода: обязательные и необязательные текстовые поля, переключатели и кнопку Submit:
Ниже приведены правила проверки для данной формы.
Поле | Правила проверки |
---|---|
Name | Обязательно. + Должен содержать только буквы и пробелы |
Обязательно. + Должен содержать действительный адрес электронной почты (с @ и.) | |
Website | Дополнительные. Если он присутствует, он должен содержать допустимый URL-адрес |
Comment | Дополнительные. Многострочный ввод (текстовое поле) |
Gender | Обязательно. Необходимо выбрать один |
Сначала мы рассмотрим простой HTML-код для формы:
Текстовые поля
Поля «имя», «электронная почта» и «веб-сайт» являются элементами текстового ввода, а поле комментария — текстовым полем. HTML-код выглядит следующим:
Name: <input type="text" name="name">
E-mail: <input type="text" name="email">
Website: <input type="text" name="website">
Comment: <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"]);?>">
При отправке формы данные формы передаются методом = "Post".
Что такое переменная $ _сервер ["фп_селф"]?
$ _сервер ["фп_селф"] является супер глобальной переменной, которая возвращает имя файла выполняющегося в данный момент скрипта.
Таким образом, $ _сервер ["фп_селф"] отправляет отправленные данные формы на саму страницу, вместо того, чтобы прыгать на другую страницу. Таким образом, пользователь получит сообщения об ошибках на той же странице, что и форма.
Что такое функция хтмлспеЦиалчарс ()?
Функция хтмлспеЦиалчарс () преобразует специальные символы в сущности HTML.
Это означает, что он заменит символы HTML, такие как < и > с & lt; и & gt;.
Это предотвращает использование злоумышленниками кода путем введения кода HTML или JavaScript
(межсайтовые скриптовые атаки) в формах.
Большая заметка о безопасности формы PHP
Переменная $ _сервер ["фп_селф"] может быть использована хакерами!
Если фп_селф используется на вашей странице, то пользователь может ввести косую черту (/), а затем Некоторые команды сценариев кросс-сайта (XSS) для выполнения.
Межсайтовые сценарии (XSS) — это тип уязвимости компьютерной безопасности, который обычно встречается в веб-приложениях. XSS позволяет злоумышленникам внедрить клиентский сценарий на веб-страницы, просматриваемые другими пользователями.
Предположим, что у нас есть следующая форма на странице с именем "тест_форм. php":
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
Теперь, если пользователь вводит нормальный URL в адресной строке, как "http://www.example.com/test_form.php", приведенный выше код будет переведен на:
<form method="post" action="test_form.php">
Пока все в порядке.
Однако учтите, что пользователь вводит следующий URL-адрес в адресной строке:
http://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>
Этот код добавляет тег сценария и команду Alert. И когда страница загружается, код JavaScript будет выполняться (пользователь увидит окно оповещения). Это всего лишь простой и безобидный пример того, как можно использовать переменную фп_селф.
Имейте в виду, что любой код JavaScript может быть добавлен внутри тега < script >! Хакер может перенаправить пользователя в файл на другом сервере, и этот файл может содержать вредоносный код, который может изменить глобальные переменные или отправить форму на другой адрес для сохранения пользовательских данных, например.
Как избежать $ _сервер ["фп_селф"] подвиги?
$ _сервер ["фп_селф"] эксплойтов можно избежать с помощью функции хтмлспеЦиалчарс ().
Код формы должен выглядеть так:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Функция хтмлспеЦиалчарс () преобразует специальные символы в сущности HTML. Теперь, если пользователь пытается использовать переменную фп_селф, это приведет к следующему результату:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">
Попытка подвига терпит неудачу, и никакой вред не сделан!
Проверка данных формы с помощью PHP
Первое, что мы будем делать, это передать все переменные через PHP в хтмлспеЦиалчарс () функции.
При использовании функции хтмлспеЦиалчарс (); Затем, если пользователь пытается отправить следующее в текстовом поле:
< сценарий > расположение. href (' http://ВВВ.хаккед.ком ') </script >
-Это не было бы выполнено, потому что оно было бы сохранено как код экранированный HTML, как это:
& lt; скрипт & gt; Location. href (' http://ВВВ.хаккед.ком ') & lt;/скрипт&АМП;ГТ;
Теперь код безопасен для отображения на странице или внутри сообщения электронной почты.
Мы также будем делать еще две вещи, когда пользователь отправляет форму:
- Прокладка ненужных символов (лишнего пространства, табуляции, новой строки) из входных данных пользователя (с помощью функции PHP Trim ())
- Удаление обратной косой черты (\) из входных данных пользователя (с помощью функции PHP stripslashes ())
Следующий шаг заключается в создании функции, которая будет делать все проверки для нас (что гораздо удобнее, чем писать же код снова и снова).
Будем называть функцию тест_инпут ().
Теперь мы можем проверить каждую переменную $ _пост с помощью функции тест_инпут (), и сценарий выглядит следующим:
Пример
<?php
// define variables and set to empty values
$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;
}
?>
Обратите внимание, что в начале скрипта мы проверяем, была ли форма отправлена с помощью $ _сервер ["рекуест_месод"]. Если рекуест_месод является POST, то форма была отправлена-и она должна быть проверена. Если он не был отправлен, пропустите проверку и отобразите пустую форму.
Однако в приведенном выше примере все поля ввода являются необязательными. Сценарий работает нормально, даже если пользователь не вводить какие-либо данные.
Следующий шаг состоит в том, чтобы сделать поля ввода обязательными и при необходимости создать сообщения об ошибках.