112

我正在尝试提出一个足够好的反垃圾邮件机制来防止自动生成的输入。我读过像验证码这样的技术,1+1=?东西运行良好,但它们也提供了一个额外的步骤,阻碍了应用程序的免费快速使用(我不是在寻找类似的东西)。

我已经尝试在我的所有表单中设置一些隐藏字段,display: none; 但是,我确信可以配置一个脚本来跟踪该表单字段 id 而根本不填写它。

您是否实施/知道一种好的反自动填表机器人方法?有没有什么东西可以通过 HTML 和/或服务器端处理无缝完成,并且(几乎)是防弹的?(没有 JS,因为可以简单地禁用它)。

我试图不依赖会话(即计算单击按钮的次数以防止过载)。

4

28 回答 28

77

实际上,我发现一个简单的 Honey Pot 字段效果很好。大多数机器人填写他们看到的每个表单字段,希望绕过必填字段验证器。

http://haacked.com/archive/2007/09/11/honeypot-captcha.aspx

如果您创建一个文本框,将其隐藏在 javascript 中,然后验证服务器上的值是否为空白,这会淘汰 99% 的机器人,并且不会让 99% 的用户感到沮丧。剩下的 1% 禁用了 javascript 的人仍然会看到文本框,但您可以为这些情况添加一条消息,例如“将此字段留空”(如果您完全关心它们的话)。

(另外,请注意,如果您在该字段上执行 style="display:none",那么机器人很容易看到并丢弃该字段,这就是我更喜欢 javascript 方法的原因)。

于 2010-03-05T17:26:54.657 回答
74

解决反垃圾邮件的一种易于实现但并非万无一失(尤其是针对“特定”攻击)的方法是跟踪表单提交和页面加载之间的时间。

机器人请求页面,解析页面并提交表单。这很快。

人类键入 URL,加载页面,在页面完全加载之前等待,向下滚动,阅读内容,决定是否评论/填写表格,需要时间填写表格,然后提交。

时间上的差异可能很微妙;以及如何在没有 cookie 的情况下跟踪这个时间需要某种服务器端数据库。这可能会影响性能。
您还需要调整阈值时间。

于 2010-03-05T15:10:22.213 回答
25

如果 -机器人根本找不到任何东西form怎么办?

3个例子:

  1. 使用 AJAX 插入表单
  • 如果您对禁用 JS 且无法查看/提交表单的用户感到满意,您可以通知他们并让他们首先使用 noscript 语句启用 Javascript:
<noscript>
  <p class="error">
    ERROR: The form could not be loaded. Please enable JavaScript in your browser to fully enjoy our services.
  </p>
</noscript>
  • 创建一个form.html并将您放置form在一个<div id="formContainer">元素中。

  • 在您需要调用该表单的页面内,使用一个空的<div id="dynamicForm"></div>和这个 jQuery:$("#dynamicForm").load("form.html #formContainer");

  1. 完全使用 JS 构建表单

// THE FORM
var $form = $("<form/>", {
  appendTo : $("#formContainer"),
  class    : "myForm",
  submit   : AJAXSubmitForm
});

// EMAIL INPUT
$("<input/>",{
  name        : "Email", // Needed for serialization
  placeholder : "Your Email",
  appendTo    : $form,
  on          : {        // Yes, the jQuery's on() Method 
    input : function() {
      console.log( this.value );
    }
  }
});

// MESSAGE TEXTAREA
$("<textarea/>",{
  name        : "Message", // Needed for serialization
  placeholder : "Your message",
  appendTo    : $form
});

// SUBMIT BUTTON
$("<input/>",{
  type        : "submit",
  value       : "Send",
  name        : "submit",
  appendTo    : $form
});

function AJAXSubmitForm(event) {
  event.preventDefault(); // Prevent Default Form Submission
  // do AJAX instead:
  var serializedData = $(this).serialize();
  alert( serializedData );
  $.ajax({
    url: '/mail.php',
    type: "POST",
    data: serializedData,
    success: function (data) {
      // log the data sent back from PHP
      console.log( data );
    }
  });
}
.myForm input,
.myForm textarea{
  font: 14px/1 sans-serif;
  box-sizing: border-box;
  display:block;
  width:100%;
  padding: 8px;
  margin-bottom:12px;
}
.myForm textarea{
  resize: vertical;
  min-height: 120px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="formContainer"></div>

  1. 机器人诱饵输入
  • 机器人喜欢(非常喜欢)俏皮的输入元素,例如:
<input 
  type="text"
  name="email"
  id="email"
  placeholder="Your email"
  autocomplete="nope"
  tabindex="-1"
They wll be happy to enter some value such as
`dsaZusil@kddGDHsj.com`
  • 使用上述 HTML 后,您还可以使用 CSS 不显示输入:
input[name=email]{ /* bait input */
  /* do not use display:none or visibility:hidden
     that will not fool the bot*/
  position:absolute;
  left:-2000px;
}
  • 现在您的输入对用户来说是不可见的,在 PHP 中您的期望$_POST["email"] 应该是空的(没有任何值)!否则不要提交表格。
  • 最后,您需要做的就是在 (!)实际用户电子邮件地址的“bot-bait”输入之后创建另一个输入。<input name="sender" type="text" placeholder="Your email">

致谢:

Developer.Mozilla - 关闭表单自动完成
StackOverflow - 忽略 Tabindex

于 2016-01-06T00:14:48.757 回答
21

我所做的是使用隐藏字段并在其上放置时间戳,然后将其与使用 PHP 的服务器上的时间戳进行比较。

如果它的速度超过 15 秒(取决于您的表单的大小),那就是机器人。

希望这有帮助

于 2012-03-10T08:07:09.670 回答
18

几乎消除垃圾邮件的一种非常有效的方法是在其中包含文本的文本字段,例如“删除此文本以提交表单!” 并且必须删除该文本才能提交表单。

表单验证后,如果文本字段包含原始文本或任何随机文本,请不要提交表单。机器人可以读取表单名称并自动填写名称和电子邮件字段,但不知道他们是否必须实际从某个字段中删除文本才能提交。

我在我们的公司网站上实施了这种方法,它完全消除了我们每天收到的垃圾邮件。真的行!

于 2012-09-19T18:22:42.417 回答
13

如何创建一个与背景颜色相同但必须保持空白的文本字段输入框。这将解决机器人阅读显示的问题:无

于 2012-03-15T23:19:50.147 回答
9

http://recaptcha.net/

reCAPTCHA 是一项免费的反机器人服务,可帮助将书籍数字化

它已被 Google 收购(2009 年):

另见

于 2010-03-05T14:47:54.397 回答
7

许多垃圾邮件机器人只是在网络上徘徊的服务器端脚本。您可以通过在发送表单请求之前使用一些javascript 来处理其中的许多请求(即,根据某些客户端变量设置附加字段)。这不是一个完整的解决方案,并且可能导致许多问题(例如,没有 JavaScript 的用户、在移动设备上等),但它可以成为您的攻击计划的一部分。

这是一个简单的例子......

<script>
function checkForm()
{
    // When a user submits the form, the secretField's value is changed
    $('input[name=secretField]').val('goodValueEqualsGoodClient');

    return true;
}
</script>

<form id="cheese" onsubmit="checkForm">
<input type="text" name="burger">

<!-- Check that this value isn't the default value in your php script -->
<input type="hidden" name="secretField" value="badValueEqualsBadClient">

<input type="submit">
</form>

在你的 php 脚本中的某个地方......

<?php

if ($_REQUEST['secretField'] != 'goodValueEqualsGoodClient')
{
    die('you are a bad client, go away pls.');
}

?>

此外,验证码很棒,而且确实是抵御垃圾邮件的最佳方法。

于 2010-03-05T14:52:05.907 回答
5

我很惊讶还没有人提到这种方法:

  • 在您的页面上,包含一个小的隐藏图像。
  • 提供此图像时放置一个 cookie。
  • 处理表单提交时,检查 cookie。


优点:

  • 方便用户和开发者
  • 似乎是可靠的
  • 没有 JavaScript

缺点:

  • 添加一个 HTTP 请求
  • 需要在客户端启用 cookie


例如,WordPress 插件Cookies for Comments使用此方法。

于 2015-02-16T00:41:17.833 回答
5

随着可以模拟任何东西的无头浏览器(如 phantomjs)的出现,你不能假设:

  • 垃圾邮件机器人不使用 javascript,
  • 您可以跟踪鼠标事件以检测机器人,
  • 他们不会看到一个字段在视觉上是隐藏的,
  • 他们不会在提交之前等待给定的时间。

如果这曾经是真的,那它就不再是真的了。

如果您不想要一个用户友好的解决方案,只需给他们一个漂亮的“我是垃圾邮件发送者”提交按钮

 <input type="submit" name="ignore" value="I am a spammer!" />
 <input type="image" name="accept" value="submit.png" alt="I am not a spammer" />

当然,您可以使用两个图像input[type=image]按钮,在每次加载后更改顺序、替代文本、图像内容(及其大小)或name按钮的;这将需要一些服务器工作。

 <input type="image" name="random125454548" value="random125454548.png"
      alt="I perfectly understand that clicking on this link will send the
      e-mail to the expected person" />
 <input type="image" name="random125452548" value="random125452548.png"
      alt="I really want to cancel the submission of this form" />

出于可访问性的原因,您必须提供正确的文本替代方案,但我认为对于屏幕阅读器用户来说,长句子比被视为机器人更好。

附加说明:这些例子说明理解英语(或任何语言),并且必须做出一个简单的选择,对于垃圾邮件机器人来说比:等待 10 秒、处理 CSS 或 javascript、知道一个字段被隐藏、模拟鼠标移动或模拟键盘打字,...

于 2016-04-06T15:38:25.543 回答
3

一个非常简单的方法是提供一些类似的字段<textarea style="display:none;" name="input"></textarea>并丢弃所有填写了此内容的回复。

另一种方法是使用 Javascript 生成整个表单(或只是字段名称);很少有机器人可以运行它。

无论如何,您不会对来自台湾或印度的实时“机器人”采取太多行动,每个发布的链接支付 0.03 美元,并以这种方式谋生。

于 2010-03-05T15:20:11.040 回答
2

我有一个简单的方法来阻止垃圾邮件发送者,至少根据我的经验,它是 100% 有效的,并且避免使用 reCAPTCHA 和类似方法。一旦我实施了这种方法,在过去的 5 年里,我的一个网站的 html 表单上的每天近 100 封垃圾邮件减少到零。

它通过利用大多数 html 表单处理脚本(我使用 FormMail.pl)的电子邮件别名功能以及一个图形提交“代码”来工作,该代码可以在最简单的图形程序中轻松创建。一个这样的图形包括代码 M19P17nH 和提示“请在左侧输入代码”。

这个特殊的例子使用了随机的字母和数字序列,但我倾向于使用我的访客熟悉的非英语版本的单词(例如“pnofrtay”)。请注意,表单域的提示是内置在图形中的,而不是出现在表单上。因此,对于机器人而言,该表单域没有提供任何关于其用途的线索。

这里唯一真正的技巧是确保您的表单 html 将此代码分配给“收件人”变量。然后,在您的邮件程序中,确保您使用的每个此类代码都设置为电子邮件别名,该别名指向您要使用的任何电子邮件地址。由于表单上没有任何类型的提示供机器人阅读,也没有电子邮件地址,因此它不知道在空白表单字段中输入什么。如果它在表单字段中没有放置任何内容或除了可接受的代码之外的任何内容,则表单提交将失败并出现“错误收件人”错误。您可以在不同的表格上使用不同的图形,尽管根据我的经验这并不是必需的。

当然,人类可以在一瞬间解决这个问题,而不会出现与 reCAPTCHA 和类似的、更优雅的方案相关的所有问题。如果垃圾邮件发送者确实对收件人故障做出响应并将图像代码编程到机器人中,那么一旦您意识到机器人已被硬编码以进行响应,您就可以轻松更改它。在使用这种方法的五年中,我从未收到过来自我使用它的任何表单的垃圾邮件,也从未收到过任何表单用户的投诉。我确信这可以通过机器人中的 OCR 功能来解决,但我从来没有在我的任何使用 html 表单的网站上发生过这种情况。我还使用了“垃圾邮件陷阱”(隐藏的“来到这里”html 代码,指向我的反垃圾邮件政策)效果很好,但它们的效率只有 90% 左右。

于 2013-08-01T19:02:31.490 回答
1

我在这里想了很多事情:

  1. 使用 JS(虽然你不想要它)来跟踪鼠标移动、按键、鼠标点击
  2. 获取引荐网址(在这种情况下应该是来自同一域的网址)......普通用户必须在到达联系表格之前浏览网站:PHP:如何获取引荐来源网址?
  3. 使用 $_SESSION 变量获取 IP 并根据该 IP 列表检查表单提交
  4. 用一些虚拟文本填写一个文本字段,如果它被覆盖,您可以在服务器端检查它
  5. 检查浏览器版本:http ://chrisschuld.com/projects/browser-php-detecting-a-users-browser-from-php.html ...很明显,机器人不会使用浏览器而只是使用脚本.
  6. 使用AJAX逐个发送字段并检查提交之间的时间差异
  7. 在表单之前/之后使用假页面,只是为了发送另一个输入
于 2015-01-11T12:52:13.223 回答
1

另一种选择不是像许多网站那样随机字母和数字,而是随机绘制可识别对象的图片。然后要求用户输入图片中的某物是什么颜色,或者该对象本身是什么。

总而言之,每种解决方案都有其优点和缺点。您将不得不在用户难以通过反垃圾邮件机制和可以通过的垃圾邮件机器人数量之间找到一个满意的中间值。

于 2010-03-05T14:53:54.560 回答
0

我发现这样做的简单方法是放置一个带有值的字段并要求用户删除该字段中的文本。因为机器人只会填满它们。如果该字段不为空,则表示该用户不是人类并且不会发布。它与验证码的目的相同。

于 2010-05-14T13:27:38.067 回答
0

根据我的经验,如果表格只是“联系”表格,则不需要特殊措施。垃圾邮件被网络邮件服务很好地过滤(您可以通过服务器脚本跟踪网络表单请求以查看有效到达您的电子邮件的内容,当然我假设您有良好的网络邮件服务:D)

顺便说一句,我试图不依赖会话(例如,计算单击按钮的次数以防止过载)。

我认为这不好,事实上,我想要实现的是接收来自执行某些特定操作的用户的电子邮件,因为这些用户是我感兴趣的用户(例如查看“CV”页面并使用正确联系人的用户形式)。因此,如果用户做了我想做的事情,我开始跟踪它的会话并设置一个 cookie(我总是设置会话 cookie,但是当我不启动会话时,它只是一个假的 cookie,用来相信用户有一个会话)。如果用户做了一些不想要的事情,我不会费心为他保持会话,所以不会超载等。

另外,如果广告服务提供某种 api(可能已经存在)来查看用户是否“查看了广告”,这对我来说会很好,查看广告的用户很可能是真实用户,但如果他们不是真的很好,至少你得到了 1 个视图,所以没有任何损失。(相信我,广告控制比你单独做的任何事情都复杂)

于 2015-01-11T12:24:10.707 回答
0

利用:

  1. 带令牌的表格
  2. 检查表格以形成带有 IP 地址的延迟
  3. 阻止 IP(可选)
于 2015-01-11T12:32:30.923 回答
0

机器人无法执行 JavaScript,因此您可以使用 JavaScript 将某种隐藏元素注入页面,然后在提交表单之前检测它的存在,但请注意,因为您的某些用户也会禁用 JavaScript

否则我认为您将被迫使用“人性”的客户证明形式

于 2010-03-05T14:54:08.477 回答
0

我发现避免被机器人发送垃圾邮件的最佳解决方案是在表单上使用非常琐碎的问题或字段。

尝试添加这样的字段:

  • 在旁边的框中复制“你好”
  • 1+1 = ?
  • 复制框中的网站名称

这些技巧要求用户了解必须在表单上输入的内容,因此更难成为大规模机器人表单填写的目标。

编辑

正如您在问题中所述,此方法的背面是用户验证其表单的额外步骤。但是,在我看来,它比验证码要简单得多,填写表单时的开销不超过 5 秒,从用户的角度来看,这似乎是可以接受的。

于 2010-03-05T15:01:00.317 回答
0

JQuery 网站上有一个关于此的教程。虽然它是 JQuery,但这个想法是独立于框架的。

如果 JavaScript 不可用,那么您可能需要回退到 CAPTCHA 类型的方法。

于 2010-03-05T15:27:30.577 回答
0

它只是一个想法,id 在我的应用程序中使用它并且效果很好

您可以使用 javascript 或 jquery 在鼠标移动时创建 cookie,并在服务器端检查 cookie 是否存在,因为只有人类才有鼠标,cookie 只能由他们创建 cookie 可以是时间戳或可以验证的令牌

于 2014-05-19T11:44:44.160 回答
0

实际上带有显示的陷阱:没有一个像魅力一样起作用。它有助于将 CSS 声明移动到包含任何全局样式表的文件中,这将迫使垃圾邮件机器人也加载这些样式表(直接的style="display:none;"声明可能会被垃圾邮件机器人解释,就像文档本身内的本地样式声明)。

这与其他对策相结合应该使任何垃圾邮件机器人卸载他们的垃圾没有实际意义(我有一个用各种措施保护的留言簿,到目前为止它们已经落入我的主要陷阱 - 但是,如果任何机器人绕过这些,那里其他人准备好触发了吗)。

我正在使用的是假表单字段的组合(如果使用的浏览器通常不处理 CSS 或display: none也被描述为无效字段),健全性检查(即输入的格式有效吗?),时间戳(太快和太慢的提交),MySQL(用于实现基于电子邮件和 IP 地址的黑名单以及洪水过滤器),DNSBL(例如 Spamhaus 的 SBL+XBL),文本分析(例如,强烈指示垃圾邮件的词语)和验证电子邮件(以确定提供的电子邮件地址是否有效)。

关于验证邮件的注意事项:此步骤完全是可选的,但是当您选择实施时,此过程必须尽可能易于使用(也就是说,它应该归结为单击电子邮件中包含的链接) 并导致相关电子邮件地址在一段时间内被列入白名单,以避免后续验证,以防用户想要发布更多帖子。

于 2016-01-18T16:58:36.427 回答
0

您可以尝试通过在 Javascript 验证后添加正确的操作属性来欺骗垃圾邮件机器人。如果机器人阻止 Javascript,他们将永远无法正确提交表单。

HTML

<form id="form01" action="false-action.php">
    //your inputs
    <button>SUBMIT</button>
</form>

JAVASCRIPT

$('#form01 button').click(function(){

   //your Validations and if everything is ok: 

    $('#form01').attr('action', 'correct-action.php').on("load",function(){
        document.getElementById('form01').submit()
    });
})

然后我在 .attr() 之后添加一个“回调”以防止错误。

于 2017-02-14T12:13:25.093 回答
0

决定添加另一个答案,对不起。

我们使用两个的组合:

  1. 蜜罐领域name="email"(其他答案已经提到)一定要使用复杂的方法来隐藏它,比如离开屏幕或其他东西。因为机器人可以检测到display:none
  2. 当用户clicks(或者focuses如果您想对 TAB 友好)在必填字段上时由 JavaScript 设置的隐藏字段(在其他答案中未提及)

第二个选项甚至可以防止无头浏览器类型的垃圾邮件(使用 phatnom.js 或 Selenium),因为即使是 JavaScript 机器人也不会真正点击文本框。

阻止 99% 的机器人。

PS。确保仅在 LastPass 或 1Passwor 等密码管理器未填写的字段上使用焦点技巧。

出于同样的原因 - 用autocomplete="false" tabindex="-1"

于 2020-11-24T15:41:30.733 回答
0

我在表格中添加了时间检查。如果填写时间少于 3 秒,表格将不会提交,这对我来说非常有用,尤其是对于长表格。这是我在提交按钮上调用的表单检查功能

function formCheck(){
var timeStart; 
var timediff;

$("input").bind('click keyup', function () {
    timeStart = new Date().getTime();          
}); 
 timediff= Math.round((new Date().getTime() - timeStart)/1000);

  if(timediff < 3) { 
    //throw a warning or don't submit the form 
  } 
  else submit(); // some submit function

}
于 2016-09-09T21:24:26.657 回答
0

随着越来越复杂的垃圾邮件机器人和自动化浏览器等技术,确定垃圾邮件的来源将变得更加困难。但无论是由软件、人类还是两者发布,垃圾邮件都是垃圾邮件,因为它的内容。我认为最好的解决方案是通过 Cleantalk 或 Akismet 等反垃圾邮件 API 运行发布的内容。它相对便宜且有效,并且不会给用户带来麻烦。您可以在访问 API 之前检查表单提交时间和其他传统检查,以检查不太复杂的机器人。

于 2017-12-12T01:57:07.593 回答
0
  1. 我使用一种方法,其中有一个隐藏的文本框。由于机器人解析网站,他们可能会填充它。然后我检查它是否为空,如果它不是网站返回。

  2. 添加电子邮件验证。用户收到一封电子邮件,他需要单击一个链接。否则在一段时间内丢弃该帖子。

于 2016-02-20T19:35:35.880 回答
-1

只值我的五分钱。如果这样做的目的是停止 99% 的机器人听起来不错,并且如果 99% 的机器人无法运行 Java 脚本,那么最好的解决方案就是不使用具有提交操作的表单一个帖子网址。

如果表单是通过 java-script 控制的,并且 java-script 收集表单数据然后通过 HTTP 请求发送,则没有机器人可以提交表单。由于提交按钮将使用 Java 脚本来运行发送表单的代码。

于 2016-07-14T12:00:12.090 回答