PHP 生成电子邮件是否存在众所周知的风险?

are there commonly known risks of PHP generated email?

在以下代码中,通过 PHP、Apache 和 Linux 发送电子邮件。来自网站用户 $comment 的评论和她的 $emailFrom 地址显然可能具有未知性质。由于任何众所周知的安全风险,这些字段是否需要任何过滤?接收电子邮件系统将是 Gmail 并由人工处理,除了互联网固有的软件外,没有其他干预软件。

$headers = "From: " . $emailFrom . "\r\n" .
           "Reply-To: " . $emailFrom . "\r\n" .
           "X-Mailer: PHP/" . phpversion();
mail("websiteOwner@mailDomain.com", 
     "a message from somebody that viewed my website ",
     $comment, $headers); 

请注意,这个问题可能更适合 Whosebug/Codereview。请查看这篇帮助文章“What topics can I ask about here?”以获取更多信息。


如果你看一下 this 问题,问题的 OP 已经粘贴了整个脚本,你可以将其用作验证等方面的指南

两个答案都建议使用已经做好的发送邮件的解决方案,我想补充一下:


为什么要使用第三方库:

  • 减少维护开销
  • 大部分工作已为您完成
  • 不要为每个小的常见任务重新发明轮子。

为了解决您问题的安全方面问题,我想补充一点: - 您必须验证和过滤传递给脚本的信息,这应该是一种通用做法,不仅在发送电子邮件的情况下,而且在使用用户提供的应用程序输入时也是如此.

Developers need to design software with the realization that some of their users will be evil, and design accordingly. You can't trust user input, ever. - Jeff Atwood, here

您已经(简洁地)指出了电子邮件 header 注入的问题。

下一个问题是电子邮件的 body 可能包含对收件人有害的内容。尽管 MIME 电子邮件需要特定的 header 来声明它包含 MIME 编码数据,但某些 MTA 会接受并透明地 re-encode 二进制流。有些 MUA 会很乐意将 /^begin [0-7]{3,4} [a-zA-Z_.]+/ 之后的任何内容转换为附件。

即因为它代表你的代码几乎允许任何人发送任何东西到任何body.

另一个问题是仍然有很多写得不好的网络邮件客户端(也有很多好的)允许嵌入 iframe 和 body 中的脚本。 Gmail 是最好的之一,但仍有可能存在可利用的漏洞。

即一旦你修复了 header 注入问题,你可能想通过 strip_tags 检查 body 和 运行 中的 uu 和 base64 编码,然后将其转换为引用可打印。