我有一个网站电子邮件表格。我使用自定义的验证码来防止机器人发送垃圾邮件。尽管如此,我仍然收到垃圾邮件。
为什么?机器人如何击败验证码?他们是使用某种高级OCR还是只是从存储位置获取解决方案?
我该如何预防?我应该改用另一种验证码吗?
我确信电子邮件来自表单,因为它是从提供表单消息的我的电子邮件发送者发送的。字母样式也相同。
作为记录,我使用的是PHP + MySQL,但我没有在寻找解决此问题的方法。我对一般情况下机器人如何击败这些技术感兴趣。我只是以这种情况为例,所以您可以更好地理解我的要求。
我有一个网站电子邮件表格。我使用自定义的验证码来防止机器人发送垃圾邮件。尽管如此,我仍然收到垃圾邮件。
为什么?机器人如何击败验证码?他们是使用某种高级OCR还是只是从存储位置获取解决方案?
我该如何预防?我应该改用另一种验证码吗?
我确信电子邮件来自表单,因为它是从提供表单消息的我的电子邮件发送者发送的。字母样式也相同。
作为记录,我使用的是PHP + MySQL,但我没有在寻找解决此问题的方法。我对一般情况下机器人如何击败这些技术感兴趣。我只是以这种情况为例,所以您可以更好地理解我的要求。
Answers:
通过验证码的两种最简单的方法:
CAPTCHA机制本身或周围的应用程序中也可能存在错误,使某人可以绕过CAPTCHA。
顺便说一下,W3C文章“验证码的不可访问性:Web上的Visual Turing测试的替代方法”还解释了如何破坏验证码:
最早记录在系统上的攻击之一是由卡内基·梅隆大学的一名学生完成的,他将CAPTCHA图像与成人网站的访问相关联,从而获得了免费的人工来破解身份验证。[...]
外部项目显示了方法和结果,表明使用光学字符识别,许多系统可以被计算机以88%至100%的精度击败。
那么如何防止这些攻击呢?
如果您有自定义实现的CAPTCHA,则可以尝试使用流行的方式,例如reCAPTCHA。
如果您自己的CAPTCHA对OCR太容易了,或者有一个被成功利用的bug,这将有所帮助。
如果使用流行的CAPTCHA机制,则转到定制的机制或另一流行的机制可能会阻止OCR。
从技术上讲,没有什么可以阻止人类的农场:您可以创建动画GIF,其中几帧可以非常快速地显示不同的文本,而用户实际上只能看到一帧,可以使文本向各个方向变形或弯曲,或者找到新的替代方法来防止通过识别文本的OCR,仍是为解决CAPTCHA而付出代价的人将成功解决它们。
您可能希望从视觉验证码转换为声音(如果您尚未使用,并且应该同时使用),但这意味着听力受损的用户将无法使用您的应用程序。
在注释特定于域的验证码中提到了FrustratedWithFormsDesigner和GalacticCowboy。我试图找到一些有关其有效性的材料,但是没有成功,所以这只是我个人的看法:
当实际用户不知道答案时,特定于域的CAPTCHA可能会非常烦人。
示例:我正在访问面向电影的网站上的页面。我在文章中发现一个错误,并想对此发表评论以通知作者该错误。评论表单要求我作为验证码机制提供照片上显示的女演员的名字。我不知道这位女演员是谁,所以我唯一能做的就是离开网站(或者在接下来的两分钟内使用Google图片)。
另一个例子:一个网站要求给出“神秘”的同义词。对于一个会说英语的非障碍人士来说,这听起来很容易,但如果没有外部帮助,英语不好的人或有一定发育障碍的人就无法解决,这不算发现同义词或反义词是总是很棘手。
这些特定于领域的问题大多数都可以通过编程方式解决。我给出的两个示例都可以使用外部资源(Google图片和同义词字典)轻松解决。FrustratedWithFormsDesigner作为示例提供的关于晶体管的那个更好,但仍可能可以通过定制的bot解决。
没有人抵抗人类的农场。
它们要么生成数据,就像普通文本验证码绘制扭曲的字符一样,在这种情况下,生成算法本身就可以被利用来调整机器人,或者它们在某个地方找到数据,就像reCAPTCHA从扫描的书本中获取文本一样,在这种情况下机器人可以对它使用此数据(例如,如果您从词典中选取单词,要求用户提供同义词,则漫游器可以使用完全相同的词典来获得100%成功)。
添加到MainMa的答案中 ...
垃圾邮件发送者欺骗他人为他们执行验证码
基本上,垃圾邮件发送者建立了一个warez网站或一个色情网站,上面似乎都设有验证码,但这并不是真正的验证码。僵尸程序会从想要发送垃圾邮件(或以其他方式利用)的网站上提取CAPTCHA,然后将其显示在warez网站或色情网站上,该网站是有人为他们完成的。然后将验证码值传递回他们的机器人。
关于垃圾邮件发送者的更多信息
我使用reCAPTCHA,我发现它基本上一文不值。我还使用了一个自定义的垃圾邮件过滤器,该过滤器可以捕获从reCAPTCHA过去的垃圾邮件,我需要每隔几天检查一次,以防误报。
我的论坛都是自定义的,访问量很少。我不相信有人对我的网站进行了特定的攻击。不过,我的垃圾邮件过滤器每天仍会收到2k封垃圾邮件!该网站上永远不会显示任何内容。垃圾邮件发送者不会从我的垃圾邮件中受益,但他们仍然可以。
我可以看到所有垃圾邮件发送尝试中的模式,因为我将其全部记录下来。我可以告诉你:撇开垃圾邮件发送者如何通过验证码,显然,垃圾邮件发送者正在使用蛮力技术来更改填写的字段以及填充这些字段的数据和单词混合的种类。显然,他们这样做非常便宜(包括绕过CAPTCHA),以至于对单个站点进行分析以查看它们在做什么或是否不起作用甚至不花钱。
年复一年,他们继续每天以成千上万的垃圾邮件来定位我的网站,却每个月才能通过,而一天后又被手动删除。垃圾邮件便宜吗!
这将是未来数年的战斗。特别适用于像我这样的小型单人主持人站点。
编辑6/22/2017:我想补充一点,因为这篇文章,谷歌已经完全改造了reCAPTCHA,截至撰写本文时,它一直在正常工作。尽管我怀疑可能存在一些误报,或者给用户带来了痛苦,因为自从实施以来,帖子数量有所下降。2大变化是
1)他们使用图片而不是文字(因此不再使用OCR)
2)他们将其与使用reCAPTCHA的所有站点中的用户活动结合在一起。因此,如果您通过站点A上的reCAPTCHA,然后转到站点B,它甚至可能不会提示您证明自己是人类!同样(我认为),如果您在太多网站上点击了太多reCAPTCHA,它也会标记您。我确信它也会根据用户活动使用其他类型的AI。
我敢肯定,垃圾邮件发送者也要解决这个问题只是时间问题...
被剥削的超低价劳动力可能成为您网站的目标,而人类正在手动输入您的验证码短语。
如果您使用的解决方案不是过于复杂,则攻击者可能正在进行图像识别。
您还可能在代码中的某个地方存在一个错误,该错误会导致忽略CAPTCHA。
不要以为机器人在击败您的验证码。全面考虑您的系统,并查看它是否已受到威胁。
为了回应其他答案,您可能会遇到使用人工农场为他们输入验证码的机器人。
我最近讨论了一种通过要求客户端JavaScript来阻止垃圾邮件机器人的技术(并发布了随附的Drupal模块)。据我所知,在所有使用此代码的网站上,此方法的工作效率均为100%。想法是使用AJAX生成唯一的哈希并将其与其他表单数据一起提交,然后在提交表单后在后端计算相同的哈希,然后比较两个值。
我的博客文章中的全部详细信息(巧合的是,由于您提到使用PHP + MySQL,因此这些技术与此处描述的相同)。消除垃圾邮件...
如果您的网站是Twitter,并且有人专门针对它(而不是机器人找到它),那么您可以停止阅读...
否则,可能不值得使您的表单看起来不像表单。1.请勿在类型,名称或占位符中包含带有“电子邮件”的字段,对所有字段都使用简短或误导性的名称。2.不要使用实际的html表单元素和提交按钮。而是使用AJAX将其发布在普通div(样式看起来像按钮)上时。3.不要将onclick事件放在html中,而是在JavaScript中添加侦听器。4.使用JavaScript填充“在此处输入您的电子邮件地址”的所有提示,因为在抓取页面时,漫游器实际上可能不会真正触发JS(不确定这一点,但我还是这样做了)。