防止php web联系表单垃圾邮件

时间:2017-04-12 20:32:08

标签: php forms contact spam

我是一名业余网页设计师,我在stackoverflow.com和其他网站上搜索过并找到了很多针对此问题的修复程序,但是没有一个有效(可能是因为我错误地实现了它们)。我希望有更多知识的人可以帮我解决一个简单的问题,或者告诉我如何实施我发现的修复方法之一。

问题:我在我公司的网站上有一个非常简单的php联系表单。它已经运作了很多年,但在上周被黑了。我现在每天收到数百份没有评论的联系表格提交,他们只有(显然是有效的)电子邮件地址,以及名称字段中的一串字符(例如" 58ee8b52eef46")。

我已经尝试了几种技术来防止这种垃圾邮件,它们要么破坏我的php表单,要么他们不会阻止垃圾邮件。 如果可能的话,我想要一个不需要Captcha扭曲文本测试的解决方案,并且不需要填写表单的所有字段。

这是我的完整PHP代码:

<?php
if(isset($_POST['email'])) {
$email_to = "myemail@example.com";
$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();
?>

8 个答案:

答案 0 :(得分:24)

一个简单的技巧是创建一个蜜罐字段:

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();

答案 1 :(得分:1)

创建表单字段并为用户隐藏它。 在php脚本中检查是否提交了此字段,但是为空。 现在您知道请求来自您的表单和用户。

垃圾邮件将填充隐藏字段,或者如果他们使用您的PHP脚本直接未设置垃圾邮件保护字段。

HTML

<input name="website" type="text" class="website"/>

CSS

form .website{ display:none; } /* hide because is spam protection */

PHP

# spam protection
if (isset($_POST["website"]) && $_POST["website"] == "") {
  # your php code to mail here
} else {
  http_response_code(400);
  exit;
}

您可以在此处找到更多保护php表单垃圾邮件的方法:https://zinoui.com/blog/protect-web-forms-from-spam

答案 2 :(得分:1)

通常,机器人会非常快速地提交表单。因此,基于此,另一种解决方案可以是添加另一个隐藏字段,其中包含从页面被取消后经过的秒数。 可以使用JavaScript来完成。 然后在PHP中检查它。如果秒数小于5秒,则为垃圾邮件(真实客户更有可能需要更多时间来填写表单)。您可以根据表单包含的字段数来调整秒数。

答案 3 :(得分: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个单词)。根据需要调整。

答案 4 :(得分:0)

隐藏的字段,愚蠢的问题(3 + 4是什么?)等在阻止表单上的垃圾邮件方面不是很有效。

几年前我研究了这个,并提出了一个我称之为“FormSpammerTrap”的解决方案。它使用JavaScript代码“监视”焦点/ onclick所需的字段。自动化流程,除非针对特定网站进行高度自定义(这需要比spambot所有者想要的时间更长),否则无法“关注/点击”必填字段。

我的www.FormSpammerTrap.com网站上有免费解决方案。那里有一个表单,垃圾邮件可以尝试垃圾邮件...而且他们已经超过3年了。欢迎您试一试......它都是开源的,所以你可以看到它是如何工作的。 (并且,如果您使用该表单,我不会收集您的电子邮件。我回复一次,然后删除您的电子邮件。)

我的技术在阻止垃圾邮件时更有效。他们无法在该网站上浏览联系表格。

答案 5 :(得分:0)

对我来说更简单的方法。 从字面上看,我收到的所有垃圾邮件在邮件中都有一个URL。因此,我对此进行了过滤,此后没有收到任何垃圾邮件。我以前每周大约有10个工资。

在您的php文件中的 $ error_message =“”; 之下添加此代码:

if(preg_match('/http|www/i',$comments)) {
    $error_message .= "We do not allow a url in the comment.<br />";
  }

preg_match中的/ i使其不区分大小写。 “ http”还会过滤“ https”。

答案 6 :(得分:0)

我分析了一段时间以来收到的垃圾邮件。我注意到:

  1. 垃圾邮件和非垃圾邮件提交表单的时间有重叠。

    我不知道慢速垃圾邮件是人为提交的还是机器人已被编程为等待,但我收到的最慢垃圾邮件需要 26 秒,而一些非垃圾邮件的人比这更快(8 秒)。< /p>

    我经常在文本编辑器中撰写消息,并且大多数情况下不会立即提交,因此当我提交消息时,我会访问网站,然后将消息复制粘贴到表单中,提交消息只需要很少的时间秒。我想这就是这些非垃圾邮件发送者所做的。

    7% 的垃圾邮件慢于 5 秒。

  2. 只有大约一半的垃圾邮件填充了隐藏的蜜罐字段 (48%)。

  3. 大多数垃圾邮件在邮件正文中包含 URL,但大约 3% 不包含,一些非垃圾邮件包含。

这三种方法加起来过滤掉了我收到的绝大多数垃圾邮件,但也有不少漏报和一些误报。

但我发现一个指标可以检测 100% 的垃圾邮件并且不会将任何非垃圾邮件误认为垃圾邮件,那就是

消息的语言。

我经营一个非英语网站,我所有的垃圾邮件都是英文的,而所有非垃圾邮件都是英文的。

因此,我所要做的就是在邮件正文中搜索诸如“您”之类的词,这些词在所有邮件中都是通用的,并且在我自己的语言中不存在。

这可能对那些为讲英语的受众运行网站的人没有帮助,但许多网站不是英文的,对他们来说,这可能是垃圾邮件的额外指标。

答案 7 :(得分:-1)

我有另一种方法,我已经在多个网站上成功使用了十多年,而没有一次成功的垃圾邮件机器人攻击。我从服务器日志中知道,每天都有数百次垃圾邮件发送表格,但是没有一个发送给我。此方法不需要验证码或任何其他购买的软件。在这里,我将尽量不提供所有详细信息,但我会说得足够多,以至于大多数人都可以实现它。首先,您将需要一个简单的基于文本的图形,其中显示一个反垃圾邮件“代码”,以及至关重要的是,提示使用它的表单字段。其次,您将需要一个电子邮件脚本,该脚本将接受别名(例如FormMail等)在表单上创建一个必填字段,名称为“收件人”(或您的电子邮件脚本希望将表单输入发送到的任何字段名称)显示“代码”图形,内嵌提示确保将您的电子邮件脚本设置为接受图形中使用的任何代码作为真实电子邮件收件人(您)的别名。实施此代码后,人员可以轻松阅读并输入您拥有的代码是在您的图形中选择的(即在电子邮件脚本中设置的电子邮件别名)。垃圾邮件机器人仅看到一个空白字段。如果该机器人选择随机填充该字段,则会在电子邮件脚本中产生错误,表明实际上,收件人不存在。您永远不会看到该错误,也不会收到任何s pam。我已经尝试了本文其他文章中介绍的大多数其他方法,但是没有一种方法像该方法那样100%有效。当然,一个人可以击败它,但是如果您这样做,您只需在脚本设置中更改图形和电子邮件别名即可。然后,他必须重新开始手动提交。