我在网上找到了以下联系表单脚本,我想知道它是否安全,如果不是我可以使它更安全。我刚回到我认为我很久以前得到代码的页面,我看到一位评论员说:
“客户端验证仅适用于用户召集,它不会阻止垃圾邮件,黑客或恼人的网络开发人员。黑客所要做的就是创建自己的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\">";
}
?>
谢谢你看看
答案 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
不包含换行符就足够了,如果有,则拒绝发送电子邮件。