您能否告诉我如何在不丢失原始邮件数据的情况下在PHP mail()
中阻止email injection?例如。如果我需要允许用户使用\r\n
,To
,CC
等,那么我不想完全将其从邮件中删除 - 我仍然希望它们已经发送,但是没有添加任何额外的标题或以某种方式允许邮件注入发生。
互联网上的大多数建议都建议完全剥离数据 - 但我不想这样做。
我通过PHP mail()
函数发送纯文本(非HTML)消息。
你会建议什么?
答案 0 :(得分:10)
要过滤在收件人电子邮件字段中使用的有效电子邮件,请查看filter_var()
:
$email = filter_var($_POST['recipient_email'], FILTER_VALIDATE_EMAIL);
if ($email === FALSE) {
echo 'Invalid email';
exit(1);
}
这将确保您的用户只提供单一有效的电子邮件,然后您可以将其传递给mail()
功能。据我所知,没有办法使用PHP mail()
函数通过消息体注入头文件,因此数据不需要任何特殊处理。
<强>更新强>
根据the documentation for mail()
,当它直接与SMTP服务器通话时,您需要阻止邮件正文中的完全停止:
$body = str_replace("\n.", "\n..", $body);
更新#2:
显然,也可以通过主题注入,但由于没有FILTER_VALIDATE_EMAIL_SUBJECT
,您需要自己进行过滤:
$subject = str_ireplace(array("\r", "\n", '%0A', '%0D'), '', $_POST['subject']);
答案 1 :(得分:3)
假设您要将访问者的电子邮件地址放在可选的标题字段中,如下所示:
$headers = "From: $visitorEmailAddress";
但是,如果
$ visitorEmailAddress
包含
“address@email.com \ n \ NBCC:spam@v1agra.com”
你已经成为垃圾邮件主机,为邮件注入打开了大门。 这是一个非常简单的示例,但是创意垃圾邮件发送者和恶意黑客可以在您的电子邮件中隐藏潜在的破坏性脚本,因为电子邮件是作为纯文本文件发送的。即使附件也是明文转换的,他们可以通过添加mimetype内容行轻松发送附件。
如果您对FROM和/或TO字段的表单验证没问题,则必须查看电子邮件正文的表单验证。我会删除' - ='和'= - '字符,并阻止用户使用strip_tags()
键入纯HTML。
答案 2 :(得分:1)
试试这个以查看各种选项:
http://www.codeproject.com/Articles/428076/PHP-Mail-Injection-Protection-and-E-Mail-Validatio
它涵盖了几个选项,并试图解释每个选项的好处和风险。
答案 3 :(得分:0)
使用指定的mime电子邮件库,例如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);
?>