PHP Безопасность электронной почты
На PHP электронной почты в сценарии, есть лазейка.
PHP Электронная почта инъекции
Во-первых, посмотрите на последнюю главу кода PHP:
<html> <head> <meta charset="utf-8"> <title>本教程(w3big.com)</title> </head> <body> <?php if (isset($_REQUEST['email'])) { // 如果接收到邮箱参数则发送邮件 // 发送邮件 $email = $_REQUEST['email'] ; $subject = $_REQUEST['subject'] ; $message = $_REQUEST['message'] ; mail("[email protected]", $subject, $message, "From:" . $email); echo "邮件发送成功"; } else { // 如果没有邮箱参数则显示表单 echo "<form method='post' action='mailform.php'> Email: <input name='email' type='text'><br> Subject: <input name='subject' type='text'><br> Message:<br> <textarea name='message' rows='15' cols='40'> </textarea><br> <input type='submit'> </form>"; } ?> </body> </html>
Проблемы выше кода является то, что неавторизованные пользователи могут вставлять данные в заголовке сообщения с помощью формы ввода.
Если пользователь в форме поле ввода, добавив следующий текст в сообщение электронной почты, что произойдет?
[email protected]%0ACc:[email protected] %0ABcc:[email protected],[email protected], [email protected],[email protected] %0ABTo:[email protected]
Как обычно, почта () функции в приведенном выше тексте в заголовке сообщения, так что теперь во главе с дополнительным Cc :, Bcc: и To: полей. Когда пользователь нажимает кнопку отправки, на этой электронной почты будет направлен всем по указанному выше адресу!
PHP инъекции, чтобы предотвратить электронную почту
Лучший способ предотвратить инъекции электронной почты, чтобы подтвердить ввод.
Следующий код аналогичен предыдущей главе, но здесь мы увеличили обнаружение формы поля ввода проверки программы электронной почты:
<html> <head> <meta charset="utf-8"> <title>本教程(w3big.com)</title> </head> <body> <?php function spamcheck($field) { // filter_var() 过滤 e-mail // 使用 FILTER_SANITIZE_EMAIL $field=filter_var($field, FILTER_SANITIZE_EMAIL); //filter_var() 过滤 e-mail // 使用 FILTER_VALIDATE_EMAIL if(filter_var($field, FILTER_VALIDATE_EMAIL)) { return TRUE; } else { return FALSE; } } if (isset($_REQUEST['email'])) { // 如果接收到邮箱参数则发送邮件 // 判断邮箱是否合法 $mailcheck = spamcheck($_REQUEST['email']); if ($mailcheck==FALSE) { echo "非法输入"; } else { // 发送邮件 $email = $_REQUEST['email'] ; $subject = $_REQUEST['subject'] ; $message = $_REQUEST['message'] ; mail("[email protected]", "Subject: $subject", $message, "From: $email" ); echo "Thank you for using our mail form"; } } else { // 如果没有邮箱参数则显示表单 echo "<form method='post' action='mailform.php'> Email: <input name='email' type='text'><br> Subject: <input name='subject' type='text'><br> Message:<br> <textarea name='message' rows='15' cols='40'> </textarea><br> <input type='submit'> </form>"; } ?> </body> </html>
В приведенном выше коде, мы используем PHP фильтр для проверки ввода:
- FILTER_SANITIZE_EMAIL фильтр удаления сообщения электронной почты из строки недопустимых символов
- FILTER_VALIDATE_EMAIL фильтр проверить значение электронной почты
Вы можете в нашем PHP Filter Узнайте больше о фильтрах знаний.