此联系表单电子邮件脚本是否安全


Is This Contact Form Email Script Secure

我在网上找到了以下联系表单脚本,我想了解它是否安全,如果不是,我如何使其更安全。我刚刚回到我认为我很久以前得到代码的页面,我看到一位评论员说:

"客户端验证仅适用于用户会议,它不能防止垃圾邮件,黑客或烦人的Web开发人员。黑客所要做的就是在没有javascript的情况下创建自己的HTML文件。垃圾邮件机器人甚至不会使用这种形式,他们只会解析ID并发送原始数据包。始终检查服务器上的输入,永远不要信任用户。'"

我不确定这意味着什么,但希望如果有人在其下面的代码中看到漏洞,评论可能会更有意义:

<?php
$EmailFrom = Trim(stripslashes($_POST['Email']));
$EmailTo = "info@mysite.com";
$Subject = "Customer Inquiry from MySite.com";
$Name = Trim(stripslashes($_POST['Name'])); 
$Tel = Trim(stripslashes($_POST['Tel'])); 
$Email = Trim(stripslashes($_POST['Email'])); 
$Message = Trim(stripslashes($_POST['Message'])); 
// validation
$validationOK=true;
if (!$validationOK) {
  print "<meta http-equiv='"refresh'" content='"0;URL=http://www.mysite.com/contact-us-error.php'">";
  exit;
}
// prepare email body text
$Body = "";
$Body .= "Name: ";
$Body .= $Name;
$Body .= "'n";
$Body .= "Tel: ";
$Body .= $Tel;
$Body .= "'n";
$Body .= "Email: ";
$Body .= $Email;
$Body .= "'n";
$Body .= "Message: ";
$Body .= $Message;
$Body .= "'n";
// send email 
$success = mail($EmailTo, $Subject, $Body, "From: <$EmailFrom>");
// redirect to success page 
if ($success){
  print "<meta http-equiv='"refresh'" content='"0;URL=http://www.mysite.com/contact-us-success.php'">";
}
else{
  print "<meta http-equiv='"refresh'" content='"0;URL=http://www.mysite.com/contact-us-error.php'">";
}
?>

感谢您的观看

你需要了解为什么有些事情不安全,而不是在你不知道的时候问别人。

首先,您提到了客户端验证。是否有任何约束正在尝试验证客户端?例如,是否有javascript(或者可能是HTML属性)可以阻止用户在电子邮件正文中键入超过一定数量的字符?

如果是这样,并且如果您将其视为安全漏洞,则该页面不安全。如果我想以这种方式滥用您的网站,我不能仅通过浏览器以正常方式访问该网站来做到这一点。但这并不能阻止我通过网络发送任何我想要的东西。我可以使用类似 curl ( http://curl.haxx.se/) 的东西向您的服务器发送长请求;您的服务器将无法知道它不是来自浏览器,不会检查其长度,并且会发送电子邮件。

攻击者还有另一种方式可以将服务器用于显然不打算用于的事情。也就是说,他们可以添加额外的标头。例如,假设他们想要添加标头MyHeader: something malicious 。他们可以发送请求,其中$_POST['Email']是以下字符串:

me@example.com>'r'nMyHeader: something malicious'r'nJunkHeader: junk

然后,字符串"From: <$EmailFrom>"如下所示:

From: <me@example.com>
MyHeader: something malicious
JunkHeader: junk>

这些是将要发送的标头。 (我添加了一行垃圾,以便末尾的额外>不会出现为MyHeader的一部分,从而干扰我正在尝试的任何邪恶计划。

大概是因为这个漏洞,根据 http://uk1.php.net/manual/en/function.mail.php:"additional_parameters参数在safe_mode中被禁用,mail()函数在使用时会暴露一条警告消息并返回FALSE。(从 PHP4.2.3 开始。

要解决此问题,我想检查$EmailFrom是否不包含换行符就足够了,如果包含,则拒绝发送电子邮件。