我有一个用户填写的网络表单,信息发送到服务器并存储在数据库中。我担心机器人可能只是填写表格,我最终会得到一个充满无用记录的数据库。如何防止机器人填写我的表格?我在想可能类似于 Stackoverflow 的机器人检测,如果它认为你是机器人,它会要求你验证你不是。Perl、Java 或 PHP 中是否有服务器端 API?
6 回答
有几种解决方案。
使用验证码。据我所知,SO 使用reCAPTCHA 。
在表单中添加一个额外的字段并使用 CSS 将其隐藏(显示:无)。普通用户不会看到此字段,因此不会填写它。如果此字段为空,请在提交时检查。如果不是,那么您正在与一个仔细填写所有表单字段的机器人打交道。这种技术通常被称为“蜜罐”。
添加一个 JavaScript 计时器函数。在页面加载时,它从零开始一个值,然后随着时间的推移增加它。普通用户会阅读并填写您的表单一段时间,然后才提交。机器人会在收到表格后立即填写并提交表格。您检查提交时该值是否与零相差很大。如果有,那么它很可能是真正的用户。如果您只看到几秒钟(或者由于机器人不执行 JavaScript,甚至根本看不到任何价值),那么它很可能是一个机器人。但是,这只有在您决定要求您的用户启用 JavaScript 才能执行“写入”操作时才有效。
当然还有其他技术。但这些都非常简单有效。
我一直更喜欢蜜罐验证码(phil haack 的文章),因为它对用户的侵入性较小。
验证码会带来可访问性问题,最终会被软件识别所击败。
我建议阅读这篇关于机器人陷阱的简短文章,其中包括隐藏字段,正如 Matthew Vines 和 New in town 已经建议的那样。
无论如何,您仍然可以自由使用验证码和机器人陷阱。
验证码很棒。您可以做的另一件事是验证字段,这将阻止 99% 的机器人流量但不会惹恼您的用户。
我的网站,我检查邮政编码和电话号码等字段中的文本。这消除了所有非目标机器人错误信息。
您可以创建一个两步系统,其中用户填写表单,但随后必须回复电子邮件以在设定的时间段内“激活”记录 - 例如 24 小时。
在后端,您可以将它们放入一个临时表中,该表会自动删除任何早于您的时间分配的行,而不是使用所有表单提交来填充当前表。除非您遇到严重的机器人问题,否则我认为表格不会那么大,特别是如果第一个表格只有几个字段。
这种方法的一个好处是您不必使用验证码或其他可能会产生一些可访问性问题的技术。