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.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>
Этот код добавляет тег скрипта и команду оповещения. И когда страница загружается, будет выполнен код 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.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>
Код теперь безопасен для отображения на странице и внутри 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, затем
форма будет отправлена и она должна быть подтверждена.
Если он не была отправленна, пропустите проверку и отобразите пустую форму.
Однако в приведенном выше примере все поля ввода являются необязательными. Скрипт должен отлично работать, даже если пользователь не вводит никаких данных.
Следующий шаг состоит в том, чтобы сделать поля ввода обязательными и создать сообщения об ошибках, если необходимо.