PHP5 Проверка форм
В этой и следующей главах показано, как использовать PHP для проверки данных формы.
PHP Проверка форм
Подумайте о безопасности при обработке PHP форм!
На этой странице Вы увидете, как обрабатывать PHP формы с учетом безопасности. Правильная проверка данных формы важна чтобы защитить форму от хакеров и спамеров!
Форма HTML, в которой Вы будем работать в этой главе, содержит различные поля ввода: обязательные и дополнительные текстовые поля, радио-кнопки, кнопку отправки:
Правила проверки для приведенной выше формы следующие:
| Поле | Правило проверки |
|---|---|
| Имя | Обязательно. + Должно содержать только буквы и пробелы |
| Обязательно. + Должно содержать действительный адрес электронной почты (с @ и .) | |
| Вебсайт | Произвольно. Если оно присутствует, оно должно содержать допустимый URL адрес |
| Комментарий | Произвольно. Многострочное поле ввода (textarea) |
| Пол | Обязательно. + Необходимо выбрать один из |
Сначала рассмотрим простой HTML код для формы:
Поля ввода
Поля - Имя, E-mail, Вебсайт, являются элементами ввода текста, а Комментарий полем-текстового ввода. 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 код выглядит так:
Пол:
<input type="radio" name="gender"
value="Женский">Женский
<input type="radio" name="gender" value="Мужской">Мужской
PHP Элементы формы
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>
Этот код добавляет тег скрипта и команду оповещения. И когда страница загружается, будет выполнен код JavaScript (пользователь увидит окно предупреждения). Это просто и безобидный пример того, как переменная PHP_SELF может быть использован.
Помните об этом любой код JavaScript может быть добавлен внутри тега <script>! Хакер может перенаправить пользователя в файл на другом сервере, и этот файл может содержать вредоносный код это может изменить глобальные переменные или передать форму адреса другому для сохранения пользовательских данных, например.
Как избежать злоупотребление $_SERVER["PHP_SELF"]?
Злоупотребление $_SERVER["PHP_SELF"],
можно избежать с помощью функции htmlspecialchars().
Код формы должен выглядеть следующим образом:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Функция htmlspecialchars(), преобразует специальные символы в HTML сущности. Теперь, если пользователь
пытается использовать эту переменную, это выльется в следующие вывод:
<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>
Код теперь безопасен для отображения на странице и внутри e-mail.
Мы также сделаем еще две вещи, когда пользователь отправляет форму:
- Прокладка ненужных символов (лишний пробел, табуляции,
символы новой строки) ввод данных пользователя с отделкой функции
PHP() - Удаление обратной косой черты
\ввод данных пользователя с 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, затем
форма будет отправлена и она должна быть подтверждена.
Если он не была отправленна, пропустите проверку и отобразите пустую форму.
Однако в приведенном выше примере все поля ввода являются необязательными. Скрипт должен отлично работать, даже если пользователь не вводит никаких данных.
Следующий шаг состоит в том, чтобы сделать поля ввода обязательными и создать сообщения об ошибках, если необходимо.
