PHP 5 Проверка форм
Курс по основам языка программирования PHP.
W3Schools на русском языке. Уроки для начинающих
В этой и последующих главах показано, как использовать PHP для проверки данных формы.
PHP Проверка формы
Подумайте о БЕЗОПАСНОСТИ при обработке PHP форм!
На этих страницах будет показано, как обрабатывать PHP формы с учетом требований безопасности. Надлежащая проверка данных формы важна для защиты вашей формы от хакеров и спамеров!
HTML форма, над которой мы будем работать в этих главах, содержит различные поля ввода: обязательные и необязательные текстовые поля, переключатели (кнопка radio) и кнопка отправки:
Перейти на форму (смотреть в отдельном окне).
Правила проверки для данной формы следующие:
Поле | Правила валидации |
---|---|
Имя | Обязательно. + Должно содержать только буквы и пробелы |
Обязательно. + Должно содержать действительный адрес электронной почты (с @ и .) | |
Web-сайт | Необязательно. Если он присутствует, должно содержать действительный URL |
Комментарий | Необязательно. Многострочное поле ввода (текстовое поле) |
Пол | Обязательно. Необходимио выбрать один вариант |
Сначала мы рассмотрим простой HTML-код для формы:
Текстовые поля
Поля name, email и website являются элементами ввода текста, а поле комментария - текстовой областью. 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
Элемент формы
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.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">
Пока всё good!
Однако учтите, что пользователь вводит следующий 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>
Этот код добавляет тег скрипта и команду оповещения. И когда страница загрузится, код JavaScript будет выполнен (пользователь увидит окно с предупреждением). Это всего лишь безобидный пример того, как можно использовать переменную PHP_SELF.
Помните, что любой код JavaScript может быть добавлен в скрипт тега <script>!
Хакер может перенаправить пользователя в файл на другом сервере, и этот файл может содержать вредоносный код, который может изменять глобальные переменные или отправлять форму по другому адресу, например, для сохранения пользовательских данных.
Как избежать эксплойтов $_SERVER["PHP_SELF"]?
Exploits - перевод с анг. - уязвимости, бреши в коде.
$_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/"><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, то форма была отправлена - и она должна быть подтверждена. Если она не была отправлена, пропустите проверку и отобразите пустую форму.
Однако в приведенном выше примере все поля ввода являются необязательными. Скрипт будет работать нормально, даже если пользователь не введёт никаких данных.
Следующим шагом является обязательное заполнение полей ввода и создание сообщений об ошибках, если это необходимо.
Не выкладывайте свой код непосредственно в комментариях, он отображается некорректно. Воспользуйтесь такими сервисами, как jsfiddle.net, codepen.io, liveweave.com, jsbin.com, сохраните код на любом из этих сервисов и в комментариях дайте на него ссылку. Так будет виден и код, и результат.