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

时间:2013-09-12 21:21:41

标签: javascript php email email-validation

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

“客户端验证仅适用于用户召集,它不会阻止垃圾邮件,黑客或恼人的网络开发人员。黑客所要做的就是创建自己的HTML文件而不使用javascript。垃圾邮件机器人甚至不会使用表单他们只是为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\">";
}
?>

谢谢你看看

1 个答案:

答案 0 :(得分:0)

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

首先,您提到了客户端验证。您是否正在尝试验证客户端的约束?例如,是否有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:“{_ 1}}参数在safe_mode中被禁用,additional_parameters函数将公开警告消息并返回mail()时用过的。” (从PHP4.2.3开始。)

要解决此问题,我认为检查FALSE不包含换行符就足够了,如果有,则拒绝发送电子邮件。