PHP Проверка форм
В этой главе мы расскажем, как использовать PHP для проверки данных формы, отправленных клиентом.
Проверка форм PHP
![]() |
При обработке форм PHP необходимо учитывать безопасность.
В этой главе мы продемонстрируем безопасную обработку данных формы PHP. Чтобы предотвратить действия хакеров и спам, нам необходимо выполнить проверку безопасности формы. |
|---|
HTML-форма, представленная в этой главе, содержит следующие поля ввода: обязательные и необязательные текстовые поля, радиокнопки и кнопку отправки:
Правила проверки для вышеуказанной формы следующие:
| Поле | Правила проверки |
|---|---|
| Name | Обязательно. + Может содержать только буквы и пробелы |
| Обязательно. + Должен быть допустимый адрес электронной почты (содержащий '@' и '.') | |
| URL | Необязательно. Если присутствует, должен содержать действительный URL |
| Примечания | Необязательно. Многострочное поле ввода (textarea) |
| Пол | Обязательно. Необходимо выбрать один вариант |
Сначала рассмотрим код чистой HTML-формы:
Текстовые поля
Поля "Name", "E-mail" и "URL" являются элементами текстового ввода, а поле "Remarks" — это textarea. 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>
Радиокнопки
Поле "Gender" представлено радиокнопками. HTML-код выглядит следующим образом:
性别: <input type="radio" name="gender" value="female">女 <input type="radio" name="gender" value="male">男
Элементы формы
Код HTML-формы выглядит следующим образом:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
This form usesmethod="post"в качестве метода отправки данных.
![]() |
Что такое переменная $_SERVER["PHP_SELF"]? $_SERVER["PHP_SELF"] — это суперглобальная переменная, которая возвращает имя файла текущего выполняемого скрипта относительно корневого каталога документов. |
|---|
Таким образом, $_SERVER["PHP_SELF"] отправляет данные формы на текущую страницу вместо перехода на другую страницу.
![]() |
Что такое метод htmlspecialchars()? Функция htmlspecialchars() преобразует некоторые предопределённые символы в HTML-сущности. Предопределённые символы:
|
|---|
На что нужно обратить внимание в формах PHP?
Переменная $_SERVER["PHP_SELF"] потенциально может быть использована хакерами!
Когда хакеры используют HTTP-ссылки для атак методом межсайтового скриптинга, в серверную переменную $_SERVER["PHP_SELF"] также могут быть внедрены скрипты. Причина в том, что межсайтовый скрипт добавляется к пути выполняемого файла, поэтому строка $_SERVER["PHP_SELF"] будет содержать код JavaScript после HTTP-ссылки.
![]() |
XSS также называют CSS (Cross-Site Script) — атакой межсайтового скриптинга. Злоумышленники внедряют вредоносный HTML-код в веб-страницы. Когда пользователи просматривают страницу, HTML-код, встроенный в веб-страницу, будет выполнен, тем самым достигая конкретной цели злоумышленника. |
|---|
Укажите следующее имя файла формы как "test_form.php":
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
Теперь мы используем URL, чтобы указать адрес отправки "test_form.php". Приведённый выше код изменяется следующим образом:
<form method="post" action="test_form.php">
Всё было бы хорошо.
Однако учтите, что пользователи могут ввести следующий адрес в адресную строку браузера:
http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
В приведённом выше URL он будет разобран как следующий код и выполнен:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>
Код добавляет тег script и команду alert. При загрузке страницы этот JavaScript-код будет выполнен (пользователь увидит всплывающее окно). Это всего лишь простой пример, показывающий, что переменная PHP_SELF может быть использована хакерами.
Обратите внимание,В тег <script> можно добавить любой JavaScript-код!Хакеры могут использовать это, чтобы перенаправить страницу на страницу на другом сервере. Файл с кодом страницы может содержать вредоносный код, и код может изменять глобальные переменные или получать данные формы пользователя.
Как избежать эксплуатации $_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.php/"><script>alert('hacked')</script>">
Попытка эксплуатации уязвимости не удаётся!
Использование PHP для проверки данных формы
Сначала мы обрабатываем все данные, отправленные пользователем, через функцию PHP htmlspecialchars().
Когда мы используем функцию htmlspecialchars(), если пользователь попытается отправить следующее текстовое поле:
<script>location.href('http://www.example.com')</script>
Код не будет выполнен, потому что он будет сохранён как HTML-экранированный код, следующим образом:
<script>location.href('http://www.example.com')</script>
Приведённый выше код безопасен и может нормально отображаться на странице или вставляться в электронные письма.
Когда пользователь отправляет форму, мы выполним следующие два действия:
- Используйте функцию PHP trim() для удаления ненужных символов из введённых пользователем данных (таких как пробелы, табуляции, символы новой строки).
- Используйте функцию PHP stripslashes() для удаления обратных слешей (\) из введённых пользователем данных.
Далее давайте оформим эти функции фильтрации в виде нашей собственной функции, что может значительно повысить повторное использование кода.
Назовите функцию test_input().
Теперь мы можем использовать функцию test_input() для проверки всех переменных в $_POST. Код скрипта выглядит следующим образом:
Пример
Запустить пример »
Обратите внимание: при выполнении приведённого выше скрипта мы используем $_SERVER["REQUEST_METHOD"], чтобы определить, была ли отправлена форма. Если REQUEST_METHOD — POST, форма будет отправлена, и данные будут проверены. Если форма не отправлена, проверка будет пропущена, и будут отображены пустые поля.
В приведённом выше примере все поля ввода являются необязательными. Даже если пользователи не вводят никаких данных, всё будет отображаться нормально.
В следующих главах мы расскажем, как проверять данные, введённые пользователями.
Другие расширения