Не могли бы вы посоветовать мне, как мне избежать предотвращения отправки электронной почты в PHP mail()
без потери исходных данных? Например, если мне нужно разрешить пользователю использовать \r\n
, To
, CC
т. Д., Поэтому я не хочу полностью отделять их от сообщения – я все еще хочу, чтобы они были доставлены, но без добавления каких-либо дополнительных заголовков или каким-то образом позволять почтовую инъекцию произойдет.
Большинство советов в Интернете предлагают полностью удалить эти данные, но я не хочу этого делать.
Я отправляю сообщения обычного текста (не HTML) через функцию PHP mail()
.
Что бы вы посоветовали?
Чтобы отфильтровать действительные электронные письма для использования в поле электронной почты получателя, посмотрите на filter_var()
:
$email = filter_var($_POST['recipient_email'], FILTER_VALIDATE_EMAIL); if ($email === FALSE) { echo 'Invalid email'; exit(1); }
Это гарантирует, что ваши пользователи будут поставлять единственные, действительные электронные письма, которые затем можно передать функции mail()
. Насколько я знаю, нет возможности вводить заголовки через тело сообщения, используя функцию PHP mail()
, чтобы данные не нуждались в какой-либо специальной обработке.
Обновить:
Согласно документации для mail()
, когда она разговаривает напрямую с SMTP-сервером, вам необходимо предотвратить полные остановки в теле сообщения:
$body = str_replace("\n.", "\n..", $body);
Обновление № 2:
По-видимому, это также можно вводить и через объект, но поскольку FILTER_VALIDATE_EMAIL_SUBJECT
не FILTER_VALIDATE_EMAIL_SUBJECT
, вам нужно будет сделать фильтрацию самостоятельно:
$subject = str_ireplace(array("\r", "\n", '%0A', '%0D'), '', $_POST['subject']);
Предположим, вы хотите поместить адрес электронной почты посетителя в поле дополнительного заголовка следующим образом:
$headers = "From: $visitorEmailAddress";
Однако, если
$ visitorEmailAddress
содержит
"Address@email.com \ п \ NBCC: spam@v1agra.com"
вы сделали себе спам-хост, открыв дверь для почтовой инъекции. Это очень простой пример, но творческие спамеры и злонамеренные хакеры могут скрывать потенциально опасные сценарии в вашем письме, поскольку электронная почта отправляется как файл открытого текста. Даже вложения преобразуются в открытый текст, и они могут легко отправлять прикрепления, добавляя строку содержимого mimetype.
Если проверка формы для полей FROM и / или TO в порядке, вы должны посмотреть на проверку формы для тела письма. Я бы strip_tags()
'- =' и '= -' и strip_tags()
пользователям вводить простой HTML с помощью strip_tags()
.
Попробуйте просмотреть различные варианты:
http://www.codeproject.com/Articles/428076/PHP-Mail-Injection-Protection-and-E-Mail-Validatio
Он охватывает несколько вариантов и пытается объяснить преимущества и риски каждого из них.
Используйте назначенную электронную почту электронной почты, например Mail_Mime
:
<?php include 'Mail.php'; include 'Mail/mime.php' ; $mime = new Mail_mime(); $mime->setTXTBody("Message goes here"); $hdrs = $mime->headers(array( 'From' => 'you@yourdomain.com', 'Subject' => 'Test mime message' )); $body = $mime->get(); $mail = &Mail::factory('mail'); $mail->send('postmaster@localhost', $hdrs, $body); ?>