一尘不染

正确防止PHP中的邮件注入

php

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

互联网上的大多数建议都建议完全删除该数据-但我不想这样做。

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

您有什么建议?


阅读 304

收藏
2020-05-29

共1个答案

一尘不染

要过滤有效的电子邮件以在收件人电子邮件字段中使用,请查看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,您需要自己进行过滤:

$subject = str_ireplace(array("\r", "\n", '%0A', '%0D'), '', $_POST['subject']);
2020-05-29