防止 PHP 网页联系表单垃圾邮件。

40

我是一名业余网页设计师,我在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();
?>

2
你看过 captcha 吗? - RiggsFolly
我确定之前已经向你提到过,但是Google reCAPTCHA现在对于大多数合法访问者来说是不可见的。 - Steve
2
我考虑过使用验证码。但是我更喜欢不使用验证码的解决方案,以保持我的网站干净整洁的外观。 - user7858610
1
任何人都不应该使用reCaptcha。这是不道德的,因为为了使用它,您需要故意感染您的网站以针对您的用户进行间谍软件攻击。任何不同意跟踪(例如通过阻止来自Google的第三方脚本)的人都无法使用由reCaptcha“保护”的您网站的任何部分。 - Skylar Ittner
1
我太多次不得不点击十几次才能通过验证码,因为它们现在用新的图片替换了一些旧的。真是让人烦恼。请尽量避免使用它们! - Patanjali
显示剩余6条评论
12个回答

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个单词)。根据需要进行调整。


1
你好,感谢您的回答。我已经实施了类似于您的另一个修复方法。然而,我们偶尔会收到一些仅包含电子邮件或电话号码而没有评论的人提交的表单。我们实际上已经将这样的潜在客户转化为销售机会,所以我不想取消接收没有评论的表单的可能性。希望这样说得清楚。 - user7858610
1
这很有道理,但这真的为垃圾邮件机器人打开了大门。在这种情况下,您可能需要考虑添加一个“只发送信息”复选框,并默认禁用提交按钮(以便机器人无法提交表单),然后在评论已输入或用户勾选该复选框时使用JavaScript启用它。 - rickdenhaan
不确定禁用提交按钮是否能够防止使用自动化技术(如CURL)的垃圾邮件机器人。它们的技术可以“看到”隐藏字段 - 即使是隐藏的提交按钮,并提交表单。 - Rick Hellewell

-2

我有另一种方法,我已经在几个网站上成功使用了十多年,没有一个垃圾邮件机器人攻击成功。从服务器日志中我知道这些表单每天被垃圾邮件攻击数百次,但是没有一个成功的攻击。这种方法不需要验证码或任何其他购买的软件。我会尽量不透露所有细节,但我会说足够让大多数人能够实现它。

首先,您需要一个简单的基于文本的图形,显示反垃圾邮件“代码”,以及与其配合使用的表单字段的提示,这一点至关重要。

其次,您需要一个电子邮件脚本,该脚本将接受别名(例如FormMail和许多其他脚本)。在您的表单上创建一个必填字段,名称为“收件人”(或您的电子邮件脚本期望发送表单输入的任何字段名称)。显示您的“代码”图形,并嵌入提示。确保设置您的电子邮件脚本接受您在图形中使用的任何代码作为真实电子邮件收件人(即您)的别名。

当实施此方法时,人类可以轻松阅读并输入您选择的代码(即在电子邮件脚本中设置的电子邮件别名)。垃圾邮件机器人只会看到一个空白字段。

如果机器人选择随机填写该字段,它将在电子邮件脚本中生成一个错误,实际上是说收件人不存在。您永远不会看到该错误,也不会收到任何垃圾邮件。我已经尝试了其他帖子中描述的大多数其他方法,但没有一种像这种方法一样百分之百有效。

当然,人类可以打败这个方法,但如果他这样做,您只需更改脚本设置中的图形和电子邮件别名。然后,他必须重新开始手动提交。


2
你能否重新编写这段内容,提供更多的逐步过程,并将文本分解开来吗?这样很难理解。 - Rocky Kev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接