关于验证码:你是人吗? (或如何防止垃圾邮件)

Are you human? (or How to prevent spam)

您知道哪些机制可以防止您的网站被匿名垃圾邮件发送者滥用。

例如,假设我有一个人们可以投票的网站。 但我不希望有人一路垃圾邮件到顶部。 所以我发现(a)创建一个帐户,只允许投票一次,(b)CAPTCHA减少垃圾邮件。 您还知道其他哪些方法以及它们有多好?


alt text

来自xkcd


我注意到的最重要的事情是,无论你做什么,你都希望你的系统是独一无二的。您希望攻击者必须为您的特定站点定制自动化程序,而不是仅仅在其上抛出一个几乎可以在任何地方工作的预先存在的脚本。它甚至不必是加密安全的;它只是让你的网站与常规有点不同。

这并不意味着您不能或不应该使用预先构建的验证码小部件。绝对要用其中一个作为起点!它只是意味着你必须在某个地方对它进行自定义,以便在标准之外发生一些额外的事情,并打破任何通常会使其失败的预先存在的脚本。

如果您的网站变得足够大以至于您的攻击者专门针对它,那么您的简单小定制可能就不再适用了,您可能会做一些更特别的事情并考虑真正的加密等等。但那是一个"好"的问题之一。


对于CAPTCHA系统,我衷心推荐reCAPTCHA。

传统的计算机生成的CAPTCHA最终将通过开发足够智能的系统来打破。例如,这里有人声称打破谷歌CAPTCHA,以前被认为是牢不可破的,命中率为30%。根据定义,reCAPTCHA仅显示光学字符识别无法识别的图像。

与此同时,用户的努力将转向共同利益 - 他们通过识别无法自动识别的单词来帮助数字化书籍。

请参阅此处以获取进一步说明并进行试用。


Captcha

从量子随机比特发生器服务,到MNeylon


我是"隐藏领域"CAPTCHA的粉丝。我不记得我在哪里读到它,但想法是这样的:

  • 正常创建表单
  • 添加一个额外的字段但隐藏它(即周围的div或表行上的style="display:none")
  • 提交后,如果该字段为空,请执行相应的操作(例如发送电子邮件);如果该字段已填写,那么它是一个机器人提交者

如果用户的浏览器没有处理CSS(或者他们关闭了CSS),这种情况就会失败,这是非常罕见的。


  • 限制每次每个IP地址的投票数
  • 阻止匿名代理。
  • 对于投票:如何在"基于每个会话"的基础上改变表单必须返回的值。一旦"1"表示第一项,"2"表示第二项。然后"77"表示第一项,"812"表示第二项,...可能是场景背后的一些简单数学,但它阻止用户一次又一次地发送相同的HTTP查询。
  • 什么对我很有用:使用AJAX表单,而不是简单的HTTP表单。从技术上讲,虚假投票并没有那么复杂,但我写了一个简单的博客软件,它只有垃圾邮件保护机制是通过AJAX提交评论 - 到目前为止没有垃圾邮件。


投票的收费,就像他们在一些电视"人才"节目中所做的那样,并且一直被垃圾邮件发送到银行!

说真的,这是一个非常棘手的问题,有一天(也许很快,如果你听Ray Kurzweil),计算机将进行测试以筛选出人类。我添加到列表中的答案有明显的缺点,但仅仅是为了枚举:审核(让人类进行测试)和基于IP的跟踪(限制来自主机的投票数)。


我通常使用两者的组合:匿名用户可以自由浏览所有内容,但如果他想投票,那么他必须注册。

在注册过程中,根据具体情况,我使用optin thru邮件(完成注册并确认至少存在邮箱)和/或CAPTCHA。

从那时起,您可以决定用户是否可以多次使用vonte或任何其他规则。

顺便说一下,我不是基于IP的约束的粉丝:在很多情况下,大型组织的网络对所有用户使用的IP很少,因此阻止可能投票的用户的风险很高。


在最佳非基于图像的CAPTCHA的答案中有一些想法?问题,如果你还没有看到它。


这是人类计算的研究领域。

这里有Luis von Ahn的精彩视频:
http://video.google.com/videoplay?docid=-8246463980976635143


stackoverflow有一些有助于此的功能;我认为您可以采取的最有用的一步是禁用匿名用户和新帐户投票的能力。这样,没有人可以注册数百个帐户并使用他们的一票来压制其他用户。我要说在一段时间内要求一些帖子或会员资格都是不错的选择。

有人会说你可以允许每个IP地址一次投票来帮助解决这个问题,但是我玩了很多游戏,其中具有无限数量代理的恶意用户违反了基于IP地址的安全性。这是一种威慑力,但精明的用户将轻松绕过它。


推荐阅读