保护PHP电子邮件表单不被注入


Protecting PHP email form from injection?

我听说PHP表单被滥用来发送表单应该发送给的人的电子邮件。这是一个实际的问题吗?如果是,如何解决?它与防止SQL注入类似吗?

您谈论的是电子邮件注入安全漏洞。例如,如果您像下面的代码示例中那样将自定义标头传递给mail()函数,那么您就很容易受到攻击:

<?php
$additional_headers = "Reply-To: {$_GET['user_email']}";
mail($to, $subject, $message, $additional_headers);
?>

假设一个恶意用户不仅传递了他的电子邮件,还传递了类似以下的附加邮件头:

<?php
//$_GET['user_email'] = "me@example.net";// this is what you expect
// this is what you're getting actually
$_GET['user_email'] = "me@example.net'r'nBcc: someone@example.net, ...";
?>

然后,一个恶意用户会从你的服务器上以你的名义向一个几乎无限的用户列表发送一份据称充斥着SPAM的信息的副本。通过添加某些安全的MIME头,用户甚至可以用自己的方式完全替换您的消息。你只能想象这会导致什么后果!

解决方案很简单:不要相信你从用户那里收到的任何东西,并过滤/验证收到的数据。

如果未正确过滤输入,任何表单都容易受到攻击。无论是电子邮件表单、注册表单,还是由PHP支持,都无关紧要。

对于电子邮件表单,请考虑PHP的过滤函数来正确地清理电子邮件。

一个好的经验法则是记住FIFO:过滤输入,转义输出。

超级全局变量应该被认为是脏的并且需要过滤(输入)。输出转义取决于上下文:给某人发电子邮件、插入数据库、以HTML呈现——所有这些都需要不同的输出过滤技术。