В этой главе мы покажем, как использовать PHP для проверки данных формы, отправленных клиентом.
Нам необходимо учитывать безопасность при работе с формами PHP. В этой главе мы продемонстрируем безопасную обработку данных формы PHP. Чтобы предотвратить хакеров и спам, нам необходимо выполнить проверку безопасности данных в форме. |
HTML-форма, описанная в этой главе, содержит следующие поля ввода: обязательные и необязательные текстовые поля, переключатели и кнопки отправки:
Вышеуказанные правила проверки формы следующие:
Поле | Правила валидации |
---|---|
имя | должен. +может содержать только буквы и пробелы |
Электронная почта | должен. + должен быть действительным адресом электронной почты (содержит «@» и «.») |
URL-адрес | Необязательный. Если он присутствует, он должен содержать действительный URL-адрес. |
Примечание | Необязательный. Многострочные поля ввода (текстовые поля) |
пол | должен. Должен выбрать один |
Сначала давайте взглянем на чистый HTML-код формы:
Поля «Имя», «Электронная почта» и «Веб-сайт» являются элементами ввода текста, а поле «Примечания» — текстовой областью. HTML-код выглядит следующим образом:
«Имя»: <input type="text" name="name">Электронная почта: <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="female">Женский<input type="radio" name="gender" value="male">Мужской
Код 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. Предопределенные символы: & (амперсанд) становится & " (двойная кавычка) становится " ' (одинарная кавычка) становится ' < (меньше чем) становится < > (больше чем) стать> |
Переменная $_SERVER["PHP_SELF"] может быть использована хакерами!
Когда хакеры используют HTTP-ссылки межсайтового скриптинга для атаки, серверная переменная $_SERVER["PHP_SELF"] также будет встроена в скрипт. Причина в том, что межсайтовый сценарий добавляется к пути к исполняемому файлу, поэтому строка $_SERVER["PHP_SELF"] будет содержать программный код JavaScript за HTTP-ссылкой.
XSS также называют CSS (межсайтовый сценарий) — атака с использованием межсайтовых сценариев. Злоумышленники вставляют вредоносный HTML-код в веб-страницу. Когда пользователь просматривает страницу, HTML-код, встроенный в веб-страницу, выполняется, тем самым достигая особой цели злоумышленника. |
Укажите следующее имя файла формы «test_form.php»:
<form Method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
Теперь мы используем URL-адрес для указания адреса отправки «test_form.php», а приведенный выше код изменяется следующим образом:
<form метод="post" action="test_form.php">
Это было бы прекрасно.
Однако учтите, что пользователь введет в адресную строку браузера следующий адрес:
http://www.codercto.com/test_form.php/%22%3E%3Cscript%3Ealert('взломанный')%3C/script%3E
Приведенный выше URL-адрес будет преобразован в следующий код и выполнен:
<form Method="post" action="test_form.php/"><script>alert('взломан')</script>
В код добавлен тег сценария и добавлена команда оповещения. Этот код Javascript будет выполнен при загрузке страницы (пользователь увидит всплывающее окно). Это всего лишь простой пример того, как хакеры могут использовать переменную PHP_SELF.
Обратите внимание, что любой код JavaScript можно добавить в тег <script>! Хакеры могут использовать это для перенаправления страницы на страницу на другом сервере. Файл кода страницы может защитить вредоносный код. Код может изменять глобальные переменные или получать данные формы пользователя.
$_SERVER["PHP_SELF"] можно избежать, используя функцию htmlspecialchars().
Код формы выглядит следующим образом:
<form Method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
htmlspecialchars() преобразует некоторые предопределенные символы в объекты HTML. Теперь, если пользователь захочет использовать переменную PHP_SELF, результат будет выведен следующим образом:
<form метод="post" action="test_form.php/"><script>alert('взломан')</script>">
Попытка использовать этот эксплойт не удалась!
Сначала мы обрабатываем все данные, отправленные пользователями, с помощью функции PHP htmlspecialchars().
Когда мы используем функцию htmlspecialchars(), пользователь пытается отправить следующее текстовое поле:
<script>location.href('http://www.codercto.com')</script>
Этот код не будет выполнен, поскольку он будет сохранен как экранированный HTML-код, например:
<script>location.href('http://www.codercto.com')</script>
Приведенный выше код безопасен и может нормально отображаться на странице или вставляться в электронные письма.
Когда пользователь отправляет форму, мы сделаем следующие две вещи:
Используйте функцию PHP Trim() для удаления ненужных символов (например, пробелов, табуляции, новой строки) во входных данных пользователя.
Используйте функцию PHP Stripslashes() для удаления обратной косой черты () из входных данных пользователя.
Далее, давайте напишем эти функции фильтрации в функции, которую мы определим сами, что может значительно улучшить возможность повторного использования кода.
Назовите функцию test_input().
Теперь мы можем использовать функцию test_input() для обнаружения всех переменных в $_POST. Код сценария выглядит следующим образом:
<?php//Определите переменные и установите для них пустые значения по умолчанию $name= $email= $gender= $comment= $website=""; if($_SERVER["REQUEST_METHOD"]== "POST") { $name= test_input($_POST["имя"]); $email= test_input($_POST["email"]); $website= test_input($_POST["веб-сайт"]); $comment= test_input($_POST["комментарий"]); $gender= test_input($_POST["gender"]);} functiontest_input($data){ $data= Trim ($ данные); $ данные = полосы косых черт ($ данные); $ данные = htmlspecialchars ($ данные); возврат $ данных;}?>
Обратите внимание: когда мы выполняем приведенный выше скрипт, мы будем использовать $_SERVER["REQUEST_METHOD"] для определения того, была ли отправлена форма. Если REQUEST_METHOD равен POST, форма будет отправлена и данные будут проверены. Если форма не отправлена, проверка будет пропущена и будет отображаться пустой.
Использование элементов ввода в приведенных выше примерах не является обязательным и может отображаться в обычном режиме, даже если пользователь не вводит никаких данных.
В следующей главе мы расскажем, как проверить данные, введенные пользователем.