正确防止PHP中的邮件注入

Atm*_*Atm 9 php email sendmail email-injection

您能告诉我如何在不丢失原始邮件数据的情况下防止PHP中的电子邮件注入mail()?例如,如果我需要让用户使用\r\n,To,CC等,所以我不想完全剥夺他们从消息了-我仍然希望他们供货,但没有增加任何额外的头或以某种方式使邮件注入的情况发生.

互联网上的大多数建议都建议完全剥离数据 - 但我不想这样做.

我通过PHP mail()函数发送纯文本(非HTML)消息.

你会提出什么建议?

FtD*_*Xw6 10

要过滤在收件人电子邮件字段中使用的有效电子邮件,请查看filter_var():

$email = filter_var($_POST['recipient_email'], FILTER_VALIDATE_EMAIL);

if ($email === FALSE) {
    echo 'Invalid email';
    exit(1);
}
Run Code Online (Sandbox Code Playgroud)

这将确保您的用户只提供单一,有效的电子邮件,然后您可以将其传递给该mail()功能.据我所知,没有办法使用PHP mail()函数通过消息体注入头文件,因此数据不需要任何特殊处理.

更新:

根据文档mail(),当它直接与SMTP服务器通信时,您需要阻止邮件正文中的完全停止:

$body = str_replace("\n.", "\n..", $body);
Run Code Online (Sandbox Code Playgroud)

更新#2:

显然,也可以通过主题注入,但由于没有FILTER_VALIDATE_EMAIL_SUBJECT,你需要自己进行过滤:

$subject = str_ireplace(array("\r", "\n", '%0A', '%0D'), '', $_POST['subject']);
Run Code Online (Sandbox Code Playgroud)

  • @Atern:那篇文章通过每个例子的`From`标题注入.仔细阅读.:-) (3认同)
  • @Atern注意filter_var对它允许的电子邮件有一些限制,这就是我仍然使用正则表达式进行电子邮件验证的原因,我使用:http://www.dominicsayers.com/isemail (2认同)