如何保护发送电子邮件的简单PHP脚本


How to secure a simple PHP script that sends emails?

在一个简单的联系人表单中,HTML表单触发Php脚本:

<form method="post" action="email.php">.....</form>

这封电子邮件.php给我发了一封电子邮件:

<?php
    $mess=$_POST['name']. "'r'n" .$_POST['site']. "'r'n" .$_POST['email']. "'r'n" .$_POST['meta']. "'r'n" .$_POST['message'];
    mail('myemail@gmail.com', 'Subject', $mess);
?>

HTML使用的是jQuery验证插件,但在Php方面没有这样的插件。

一位安全专家告诉我这个php脚本是多么的不安全

我可以做些什么来增强安全性?

我的猜测是,你的"安全专家"看到你使用原始$_POST数据和mail()函数,他吓坏了,但并没有停下来检查情况有多糟糕。

他有一点是,在不进行任何验证的情况下使用$_POST几乎总是会被黑客入侵,但事实上,在这种特殊情况下,我不认为这太糟糕,因为你是唯一的收件人(所以它不会被用于垃圾邮件,这是这些情况下最需要担心的),因为正文是纯文本(所以黑客不能向你发送任何讨厌的脚本或附件)。

如果没有任何验证,你可能会收到一些非常奇怪的电子邮件,因为黑客试图找到绕过你防御的方法,但不会收到太多其他电子邮件。

PHP的mail()函数是众所周知的黑客软目标,因为有很多不安全的代码在使用它。然而,mail()的真正危险往往是如果你使用了headers参数(即设置发件人地址等),而你没有使用过。由于您没有使用headers,因此风险要低得多,而且主要局限于让别人很容易给您邮寄邮件。

如果您仍然担心mail()函数的安全性,最好的解决方案是使用phpMailer这样的库。

老实说,每当有人想使用PHP的mail()函数时,我的建议总是使用phpMailer或Swiftmailer。这甚至不仅仅是安全问题;即使对于简单的情况,它们也可以使代码更易于阅读和维护。

一个大缺陷是,攻击者可能会在你的收件箱里塞满恶意或垃圾邮件,这些邮件除了非常烦人之外,还可能导致谷歌将你的域名列入垃圾邮件列表。

他们可以通过编写一个简短的脚本来调用带有一些任意数据的PHP函数,并根据需要循环使用该函数。

这是解决您所需问题的另一种方法。我希望这对其他提问者有用,因为我看到类似的问题连续出现。

如果你打算进行专业应用并专注于你的核心业务,那么我建议你使用一些带有API的安全电子邮件门户,如mailgun、mandrill或其他。这两项服务都提供了一个仪表板,您可以在其中查看电子邮件状态、发送的电子邮件数量和发送状态,以及许多其他统计数据。小规模使用是免费的。使用它是值得的,因为您将解决以下一些问题:

  • 您不需要考虑维护smtp服务器的安全性
  • 甚至可以正确配置smtp
  • 解决块和黑IP地址
  • 服务器攻击
  • 垃圾邮件问题
  • 并命名更多

两种解决方案都为PHP或其他平台提供API。

注意:几年前,我一直在自己使用我自己的smtp服务器,你知道,我花在修复和维护smtp服务器上的所有时间都不值得,因为我可以把这些时间花在做更好的事情上,把电子邮件服务部分留给专业人士。