Правильное предотвращение почтовой инъекции в PHP

Не могли бы вы посоветовать мне, как мне избежать предотвращения отправки электронной почты в PHP mail() без потери исходных данных? Например, если мне нужно разрешить пользователю использовать \r\n , To , CC т. Д., Поэтому я не хочу полностью отделять их от сообщения – я все еще хочу, чтобы они были доставлены, но без добавления каких-либо дополнительных заголовков или каким-то образом позволять почтовую инъекцию произойдет.

Большинство советов в Интернете предлагают полностью удалить эти данные, но я не хочу этого делать.

Я отправляю сообщения обычного текста (не HTML) через функцию PHP mail() .

Что бы вы посоветовали?

Related of "Правильное предотвращение почтовой инъекции в PHP"

Чтобы отфильтровать действительные электронные письма для использования в поле электронной почты получателя, посмотрите на 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); ?>