2017-04-12 79 views
1

我是一个业余的网页设计师,我已经在stackoverflow.com和其他网站上搜索,并已找到这个问题我有很多修复,但他们都没有工作(可能是因为我实施他们不正确)。我希望有更多知识的人可以通过简单的修复帮助我,或者告诉我如何实现我找到的修复之一。防止php web联系表格垃圾邮件

问题:我的业务网站上有一个非常简单的php联系表单。它工作了很多年,但在上周遭到黑客入侵。我现在每天收到数百份联系表单提交,没有评论,他们只有(显然是有效的)电子邮件地址和名称字段中的一串字符(如“58ee8b52eef46”)。

我已经尝试了几种技术来防止这种垃圾邮件,他们要么打破我的PHP形式,要么他们不阻止垃圾邮件。 如果可能的话,我想要一个不需要验证码失真文本测试的解决方案,并且不需要填写表单的所有字段。

这里是我的全部的PHP代码:

<?php 
if(isset($_POST['email'])) { 
$email_to = "[email protected]"; 
$email_subject = "website form submission"; 

function died($error) { 
    echo "We are very sorry, but there were error(s) found with the form you submitted. "; 
    echo "These errors appear below.<br /><br />"; 
    echo $error."<br /><br />"; 
    echo "Please go back and fix these errors.<br /><br />"; 
    die(); 
} 

if(!isset($_POST['name']) || 
    !isset($_POST['email']) || 
    !isset($_POST['telephone']) || 
    !isset($_POST['comments'])) { 
    died('We are sorry, but there appears to be a problem with the form you submitted.');  
} 

$name = $_POST['name']; 
$email_from = $_POST['email']; 
$telephone = $_POST['telephone']; 
$comments = $_POST['comments']; 

$error_message = ""; 
if(strlen($error_message) > 0) { 
died($error_message); 
} 
$email_message = "Form details below.\n\n"; 

function clean_string($string) { 
    $bad = array("content-type","bcc:","to:","cc:","href"); 
    return str_replace($bad,"",$string); 
} 

$email_message .= "Name: ".clean_string($name)."\n"; 
$email_message .= "Email: ".clean_string($email_from)."\n"; 
$email_message .= "Telephone: ".clean_string($telephone)."\n"; 
$email_message .= "Comments: ".clean_string($comments)."\n"; 

$headers = 'From: '.$email_from."\r\n". 
'Reply-To: '.$email_from."\r\n" . 
'X-Mailer: PHP/' . phpversion(); 
@mail($email_to, $email_subject, $email_message, $headers); 
?> 

Thank you for contacting us. We will be in touch with you soon. You will now be redirected back to example.com. 
<META http-equiv="refresh" content="2;URL=http://www.example.com"> 


<?php 
} 
die(); 
?> 
+0

你有看'captcha' – RiggsFolly

+0

林我确定我有提及d此之前,但谷歌recaptcha现在是绝大多数合法访问者无法访问。 – Steve

+0

我已考虑使用验证码。但我更喜欢一个不使用captcha的修补程序,以便在我的网站上保持整洁。 – user7858610

回答

6

一个简单的技巧是创建一个蜜罐领域:

HTML

<!-- within your existing form add this field --> 
<input type="text" id="website" name="website"/> 

CSS

/*in your css hide the field so real users cant fill it in*/ 
form #website{ display:none; } 

PHP

//in your php ignore any submissions that inlcude this field 
if(!empty($_POST['website'])) die(); 
+0

谢谢!这非常简单并且易于实施。它符合我所有的标准。但是,目前我收到的垃圾邮件中的“评论”字段为空。如果它也将“网站”字段留空,我是否仍然收到垃圾邮件? – user7858610

+0

是的,“网站”是一个很好的普遍选择,因为大多数愚蠢的垃圾邮件者正在寻求放弃链接。您可以根据需要添加尽可能多的蜜罐字段。您甚至可以添加名为'email'的蜜罐,并将您的真实电子邮件字段重命名为其他内容(如'emailaddress')。 – Steve

+0

我试图做到这一点,并插入字段和隐藏他们工作得很好,但我找不到正确的位置在哪里输入PHP代码(与死亡)到我的PHP文件。它只是在任何地方停止,即使这些字段没有填写。 – vega

0

如果您看到了没有注释的垃圾,为什么不直接添加该支票?绝对没有理由让真正的人类访问者在没有评论的情况下提交您的联系表单。

由于您不想添加验证码,短期内最简单的解决方案是检查评论是否为最少字符数,并且包含至少一定数量的单词。

例如:

$comments = trim($_POST['comments']); // trim() to strip off whitespace from beginning and end, like spaces and linebreaks 

if (strlen($comments) < 20 || substr_count($comments, " ") < 3) { 
    died('Your comment is too short.'); 
} 

这是一个非常简单的检查以查看注释包含至少20个字符和至少3个位(4个字)。根据需要调整。

+0

嗨,谢谢你的答案。我已经实施了与您的类似的另一个修复程序。然而,我们偶尔会从仅仅想知道更多信息的人那里获得表单提交,并且只包含没有评论的电子邮件或电话号码。实际上,我们已将此类潜在客户转化为销售业务,因此我不想删除没有评论的情况下接收表单的可能性。我希望这是有道理的。 – user7858610

+0

有道理,但这确实为垃圾邮件机器人打开了大门。在这种情况下,您可能需要考虑添加“只发送给我信息”复选框并默认禁用提交按钮(以便机器人无法提交表单),然后在输入评论时使用javascript启用**或**用户检查该复选框。 – rickdenhaan