В PHP-скрипте электронной почты, описанном в предыдущем разделе, имеется уязвимость.
Сначала посмотрите на PHP-код из предыдущей главы:
<html><head><meta charset="utf-8"><title>Руководство по программированию (codercto.com)</title></head><body><?phpif (isset($_REQUEST['email' ] )) { // Если параметр электронной почты получен, отправьте электронное письмо // Отправьте электронное письмо $email = $_REQUEST['email'] ; $subject = $_REQUEST['subject'] ; $_REQUEST['message'] ; mail("[email protected]", $subject, $message, "От:" . $email); echo "Письмо отправлено успешно";} else { // Если письма нет. параметр, затем Отобразить форму echo "<form Method='post' action='mailform.php'> Электронная почта: <input name='email' type='text'><br> Тема: <input name='subject' type='text'><br> Сообщение:<br> <textarea name='message' rows='15' cols='40'> </textarea><br> <input type='submit'> </form >";}?></body></html>
Проблема с приведенным выше кодом заключается в том, что неавторизованные пользователи могут вставлять данные в заголовок электронного письма через форму ввода.
Что произойдет, если пользователь добавит следующий текст в электронное письмо в поле ввода формы?
кто-то@example.com%0ACc:[email protected]%0ABcc:[email protected],[email protected],[email protected],[email protected]%0ABTo:[email protected]
Как обычно, функция mail() помещает приведенный выше текст в заголовок электронного письма, поэтому заголовок теперь имеет дополнительные поля Cc:, Bcc: и To:. Когда пользователь нажмет кнопку «Отправить», это электронное письмо будет отправлено на все указанные выше адреса!
Лучший способ предотвратить внедрение электронной почты — проверить введенные данные.
Следующий код аналогичен коду из предыдущей главы, но здесь мы добавили валидатор ввода для обнаружения поля электронной почты в форме:
<html><head><meta charset="utf-8"><title>Руководство по программированию (codercto.com)</title></head><body><?phpfunction spamcheck($field){ // filter_var ( ) Фильтровать электронную почту // Использовать FILTER_SANITIZE_EMAIL $field=filter_var($field, FILTER_SANITIZE_EMAIL //filter_var() Фильтровать электронную почту //); Используйте FILTER_VALIDATE_EMAIL if(filter_var($field, FILTER_VALIDATE_EMAIL)) { return TRUE } else { return FALSE }}if (isset($_REQUEST['email'])){ // Если параметр электронной почты получен, отправьте электронное письмо // Определить, является ли письмо законным $mailcheck = spamcheck($_REQUEST['email']); ($mailcheck==FALSE) { echo "Недопустимый ввод"; } else { // Отправить электронное письмо $email = $_REQUEST['email'] ; $subject = $_REQUEST['subject'] ; $message = $_REQUEST[' message'] ; mail("[email protected]", "Тема: $subject", $message, "От: $email" ); для использования нашей почтовой формы"; }}else{ // Если параметр электронной почты отсутствует, отобразим форму echo "<form Method='post' action='mailform.php'> Электронная почта: <input name='email' type ='text '><br> Тема: <input name='subject' type='text'><br> Сообщение:<br> <textarea name='message' rows='15' cols='40'> </textarea><br> <input type='submit'> </form>";}?></body></html>
В приведенном выше коде мы используем фильтр PHP для проверки ввода:
Фильтр FILTER_SANITIZE_EMAIL удаляет из строки недопустимые символы электронной почты.
Фильтр FILTER_VALIDATE_EMAIL проверяет значение адреса электронной почты.
Вы можете прочитать больше о фильтрах в нашем PHP-фильтре.