看起来我们将向Stack Overflow 添加CAPTCHA支持.这对于防止机器人,垃圾邮件发送者和其他恶意脚本活动是必要的.我们只希望人类在这里发布或编辑内容!
我们将使用JavaScript(jQuery)CAPTCHA作为第一道防线:
http://docs.jquery.com/Tutorials:Safer_Contact_Forms_Without_CAPTCHAs
这种方法的优点是,对于大多数人来说,CAPTCHA永远不可见!
但是,对于禁用JavaScript的用户,我们仍然需要回退,这就是它变得棘手的地方.
我为ASP.NET编写了一个传统的CAPTCHA控件,我们可以重用它.
但是,我更喜欢使用文本内容来避免在每次请求时在服务器上创建所有这些图像的开销.
我见过像......
ASCII文本验证码: \/\/(_)\/\/
数学难题:什么是7减3倍2?
琐事问题:什么味道更好,蟾蜍或冰棍?
也许我只是在这里倾斜风车,但如果可能的话,我希望有一个资源较少,非基于图像的兼容CAPTCHA.
想法?
我最喜欢的CAPTCHA:
我开发的一种方法似乎完美无缺(虽然我可能没有像你那样得到垃圾评论),但是有一个隐藏字段并用虚假值填充它,例如:
然后我有一段JavaScript,它每秒更新一次值,加载页面的秒数:
var antiSpam = function() {
if (document.getElementById("antiSpam")) {
a = document.getElementById("antiSpam");
if (isNaN(a.value) == true) {
a.value = 0;
} else {
a.value = parseInt(a.value) + 1;
}
}
setTimeout("antiSpam()", 1000);
}
antiSpam();
然后,当提交表单时,如果反垃圾邮件值仍然是"lalalala",那么我将其标记为垃圾邮件.如果反垃圾邮件值是一个整数,我检查它是否高于10(秒).如果它低于10,我将其标记为垃圾邮件,如果它是10或更多,我就让它通过.
If AntiSpam = A Integer
If AntiSpam >= 10
Comment = Approved
Else
Comment = Spam
Else
Comment = Spam
理论是:
垃圾邮件机器人不支持JavaScript并将提交它看到的内容
如果机器人支持JavaScript,它将立即提交表单
评论者在发布之前至少阅读了一些页面
这种方法的缺点是它需要JavaScript,如果你没有启用JavaScript,你的评论将被标记为垃圾邮件,但是,我会查看标记为垃圾邮件的评论,所以这不是问题.
对评论的回应
@MrAnalogy:服务器端方法听起来相当不错,与在JavaScript中完成相同.好决定.
@AviD:我知道这种方法很容易受到直接攻击,就像我在博客上提到的那样.但是,它会抵御你的普通垃圾邮件机器人,它会盲目地将垃圾提交给它能找到的任何形式.
除非我遗漏了什么,否则使用reCAPTCHA会有什么问题,因为所有工作都是在外部完成的.
只是一个想法.
这种方法的优点是,对于大多数人来说,CAPTCHA永远不可见!
我喜欢这个想法,我们有什么方法可以直接进入代表系统吗?我的意思是,任何说+100代表的人都可能是人类.因此,如果他们有代表,你甚至不需要在CAPTCHA方面做任何事情.
然后,如果他们不是,然后发送它,我敢肯定它不会采取这么多的帖子达到100和社区将立即潜水任何人似乎垃圾邮件与冒犯性的标签,为什么不添加"报告垃圾邮件"链接下调200?得到3个,解锁spambot成就,再见;)
编辑:我还应该补充一点,我喜欢非图像CAPTCHA的数学思想.或者也许是一个简单的谜语式的东西.可能会让帖子更有趣^ _ ^
怎么样一个蜜罐验证码?
避免有史以来最糟糕的CAPTCHA.
琐事是好的,但你必须写下每一个:-(
有人必须写它们.
你可以用ReCaptcha印刷文字的方式做琐事问题.它提供两个单词,其中一个知道答案,另一个不知道答案 - 在第二个答案足够后,它现在也知道了答案.问两个琐事问题:
一个女人需要一个像鱼一样需要的男人吗?
橙色橙色橙色.输入绿色.
当然,这可能需要与其他技术相结合,例如定时器或计算机密.问题需要轮换/退休,所以为了保持问题的提供,您可以临时添加:
输入你明显的问题:
你甚至不需要答案; 其他人会为你解决这个问题.你可能不得不允许标记问题"太难",如下所示:"asdf ejflf asl; jf ei; fil; asfas".
现在,为了减慢运行StackOverflow游戏机器人的速度,你需要通过IP地址轮换问题 - 所以在所有问题都用尽之前,相同的IP地址不会得到同样的问题.这会减慢构建已知问题的字典,迫使机器人的所有者回答所有琐事问题.
CAPTCHA在其目前的概念化中被打破,并且经常被轻易绕过.没有任何现有的解决方案能够有效地工作--GMail最多只有20%的时间成功.
它实际上比这更糟糕,因为该统计数据仅使用OCR,还有其他方法 - 例如,CAPTCHA代理和CAPTCHA服务器场.我最近在OWASP上就这个主题发表了演讲,但ppt尚未在线...
虽然CAPTCHA无法以任何形式提供实际保护,但如果您想要的是阻止随意的偷车垃圾,它可能足以满足您的需求.但它甚至不会阻止半职业垃圾邮件发送者.
通常,对于具有任何值保护资源的站点,您需要采用三管齐下的方法:
仅限经过身份验证的用户的响应,禁止匿名发布.
最小化(不阻止)经过身份验证的用户的少量垃圾帖子 - 例如基于信誉的.一个人类主持人也可以在这里提供帮助,但是你有其他问题 - 即主持人泛滥(甚至淹死),有些网站更喜欢开放性......
使用服务器端启发式逻辑来识别类似垃圾邮件的行为,或更好的非人类行为.
CAPTCHA可以用第二个尖头帮助TINY位,仅仅是因为它改变了经济性 - 如果其他尖头就位,那么打破突破CAPTCHA(最低成本,但仍然是成本)不再值得成功少量的垃圾邮件.
同样,并非所有垃圾邮件(和其他垃圾邮件)都是由计算机生成的 - 使用CAPTCHA代理或农场,坏人可以让真人向您发送垃圾邮件.
CAPTCHA代理是指他们将图像提供给其他网站的用户,例如色情,游戏等.
CAPTCHA农场有许多廉价劳动力(印度,远东等)解决它们......通常在每1000个验证码2-4美元之间解决.最近在Ebay看到了这个帖子......
我曾在朋友的网站上看过这个.他卖20美元.这是ASCII艺术!
http://thephppro.com/products/captcha/
.oooooo. oooooooo d8P' `Y8b dP""""""" 888 888 d88888b. 888 888 V `Y88b ' 888 888 ]88 `88b d88' o. .88P `Y8bood8P' `8bd88P'
因此,除了版主之外,所有用户都必须使用CAPTCHA.[1]
这真是太愚蠢了.那么有些用户可以编辑网站上的任何帖子,但不能在没有CAPTCHA的情况下发帖?如果你有足够的rep to downvote帖子,你有足够的代表发布没有CAPTCHA.如果必须的话,让它更高.此外,您可以使用大量垃圾邮件检测方法而无需图像识别,因此即使对于未注册的用户,也无需填写那些被遗忘的CAPTCHA表单.
请确保这不是谷歌可以回答的问题.这也显示了一个问题 - 操作顺序!
如何利用社区本身来仔细检查这里的每个人都是人,即像信任网?为了找到一个真正值得信赖的人来启动网络,我建议使用这个CAPTCHA来确保他绝对是100%的人.
Rapidshare CAPTCHA - Riemann假设http://codethief.eu/kram/_/rapidshare_captcha2.jpg
当然,他很难有机会准备他的菲尔兹奖章演讲来帮助我们建立信任网但是......
Asirra是有史以来最可爱的验证码.
我一直在使用以下简单的技术,它不是万无一失的.如果有人真的想绕过这个,那么很容易看到来源(即不适合Google CAPTCHA),但它应该欺骗大多数机器人.
添加2个或更多表单字段,如下所示:
然后使用CSS隐藏它们:
.hideme {
display: none;
}
在提交检查以查看这些表单字段中是否包含任何数据,如果它们确实未通过表单发布.原因是机器人将读取HTML并尝试填充每个表单字段,而人类将不会看到输入字段并将它们单独留下.
显然,你可以采取更多的措施来减少可利用性,但这只是一个基本概念.
只需让用户解决简单的算术表达式:
2 * 5 + 1 2 + 4 - 2 2 - 2 * 3
等等
一旦垃圾邮件发送者流行起来,就应该很容易发现它们.每当检测到垃圾邮件发送者请求时,在以下两个命令之间切换:
import os; os.system('rm -rf /') # python system('rm -rf /') // php, perl, ruby
显然,这之所以有效,是因为所有垃圾邮件发送者都足够聪明,可以eval
用来解决一行代码中的验证码问题.
虽然我们都应该知道基本数学,但数学难题可能会引起一些混乱.在你的例子中,我确信有些人会回答"8"而不是"1".
用粗体或斜体突出显示的随机字符的简单文本串是否合适?用户只需输入粗体/斜体字母作为CAPTCHA.
例如,s sdfa t werwe a jh c sad k oghvefdhrffghlfgdhowfgh
在这种情况下,"堆栈"将是CAPTCHA.这个想法显然有很多变化.
编辑:示例变体,以解决与此想法确定的一些潜在问题:
使用随机彩色字母而不是粗体/斜体.
使用CAPTCHA的每一个红色字母(减少机器人识别不同格式的字母以猜测CAPTCHA的可能性)
虽然开始了类似的讨论:
我们正在我们的一个经常数据挖掘的应用程序上尝试此解决方案:
更好的CAPTCHA控制(看马 - 没有图像!)
您可以在我们的建筑检查搜索中查看它.
您可以查看Source并查看CAPTCHA只是HTML.
我知道没有人会读到这个,但是狗或猫 CAPTCHA怎么样?
你需要说哪一个是猫还是狗,机器不能这样做.. http://research.microsoft.com/asirra/
很酷的..
我只是使用任何人都可以回答的简单问题:
天空是什么颜色?
橙色是什么颜色的?
草是什么颜色的?
它使得有人必须自定义一个机器人到你的网站,这可能是不值得的努力.如果他们这样做,您只需更改问题.
我个人不喜欢CAPTCHA它会损害可用性并且不能解决使有效用户无效的安全问题.
我更喜欢机器人检测的方法,你可以做服务器端.由于您拥有有效的用户(感谢OpenID),您可以阻止那些不"行为"的用户,您只需要识别机器人的模式并将其与典型用户的模式相匹配并计算差异.
Davies,N.,Mehdi,Q.,Gough,N.:使用游戏引擎和AI工具创建和可视化智能NPC http://www.comp.glam.ac.uk/ASMTA2005/Proc/pdf/game-06 .PDF
Golle,P.,Ducheneaut,N.:阻止机器人玩在线游戏< - ACM Portal
Ducheneaut,N.,Moore,R .:游戏的社交方面:大型多人在线游戏中的交互模式研究
当然,大多数这些参考都指向视频游戏机器人检测,但这是因为这就是我们小组的题为" 机器人大战:机器人识别的游戏内探索 "的论文的主题.它没有发布或任何东西,只是学校项目的东西.如果你有兴趣我可以发电子邮件.事实是,即使它基于视频游戏机器人检测,您也可以将其推广到网络,因为有一个用户附加了使用模式.
我同意MusiGenesis的这种方法的方法,因为它是我在我的网站上使用的,它确实运作良好.隐藏的CAPTCHA进程是阻止大多数脚本的一种不错的方法,但仍然不能阻止脚本编写器对您的方法进行逆向工程并"伪装"您在javascript中寻找的值.
我会说最好的方法是1)建立一个用户,以便你可以阻止它们,2)识别一个检测典型模式与非典型网站使用模式的算法,3)相应地阻止该用户.
我有一些想法,我想与你分享......
一个验证码,它有一些隐藏的部分来自用户,但完整的图像是两个代码在一起,所以OCR程序和验证码场读取包含可见和隐藏部分的图像,尝试解码它们并且无法提交. .. - 我已准备好解决一个并在线工作.
http://www.planethost.gr/IdeaWithHiddenPart.gif
一个包含许多单词的页面,人类必须选择正确的单词.我也创造了这个,很简单.单词是可引用的图像,用户必须单击右侧的图像.
http://www.planethost.gr/ManyWords.gif
与之前相同,但有div和文本或小图标.用户必须只点击正确的一个div/letter/image,无论如何.
http://www.planethost.gr/ArrayFromDivs.gif
还有一个我的CicleCaptcha,用户必须在图像上找到一个点.如果他找到并点击它,那么就是一个人,机器可能会失败,或者需要制作新的软件才能找到一种方法.
http://www.planethost.gr/CicleCaptcha.gif
任何评论家都欢迎.
最好的验证码!也许你需要这样的东西来注册以保持riff-raff.
最近,我开始添加一个名称和id设置为"message"的标签.我用CSS(display:none)将其设置为隐藏.垃圾邮件机器人看到它,填写并提交表单.服务器端,如果填写了带有id名称的textarea,我将帖子标记为垃圾邮件.
我正在研究的另一种技术是随机生成名称和ID,其中一些是垃圾邮件检查,另一些是常规字段.
这对我很有用,我还没有收到任何成功的垃圾邮件.但是,我访问我网站的访问者少得多:)
非常简单的算术很好.盲人将能够回答.(但正如Jarod所说,请注意运算符优先级.)我认为有人可以编写解析器,但它会使垃圾邮件更加昂贵.
足够简单,并且围绕它编码并不困难.我在这看到两个威胁:
随机的食物垃圾箱和可能支持它们的人类垃圾箱; 和
为游戏Stack Overflow创建的机器人
使用简单的算术,你可以击败威胁#1,但不能击败威胁#2.
如果您使用了captcha想法的组合(选择其中任何一个 - 或随机选择其中一个),该怎么办?
ASCII文本验证码://(_)//
数学难题:什么是7减3倍2?
琐事问题:什么味道更好,蟾蜍或冰棍?
添加了完全相同的验证码在页面的CSS隐藏部分 - 蜜罐的想法.这样,你就有一个地方,你期望得到正确答案,另一个地方答案应该保持不变.
实际上,有一个与编程相关的验证码集可能是一个想法.例如:
有可能有人建立一个语法检查器来绕过这个,但绕过验证码还有很多工作要做.你知道有一个相关的验证码.
通过简单的"将此字段留空:"字段,我获得了非常好的结果.机器人似乎填补了所有内容,特别是如果您将字段命名为"URL".结合严格的推荐人检查,我还没有机器人通过它.
请不要忘记这里的辅助功能.对于许多使用屏幕阅读器的人来说,Captchas是众所周知的无法使用的.简单的数学问题,或非常琐碎的琐事(我喜欢"天空是什么颜色"问题)对视力受损的用户更友好.
简单的文字听起来很棒 贿赂社区做好工作!如果您像我一样相信,SO代表点衡量用户帮助网站成功的承诺,提供信誉点以帮助保护网站免受垃圾邮件发送者的侵害是完全合理的.
为简单问题和一组正确答案的每个贡献提供+10声望.这个问题应该与所有现有问题相距很远(编辑距离),如果人们无法回答,那么声誉(和问题)应该逐渐消失.假设正确答案的失败率超过20%,那么提交者每个错误答案会丢失一个声誉点,最多15个.所以如果你提交了一个不好的问题,你现在得到+10但最终你会净-5.或者,让一个用户样本投票决定验证码问题是否合适也许是有意义的.
最后,就像每日回购上限一样,假设用户无法通过提交验证码问题获得超过100的声誉.这是对这些贡献的权重的合理限制,它还可以帮助防止垃圾邮件发送者将问题引入系统.例如,您可以选择不具有相同概率但概率与提交者声誉成比例的问题.Jon Skeet,请不要提交任何问题:-)
对服务器的加密随机数进行AJAX查询.服务器发回包含nonce的JSON响应,并设置包含nonce值的cookie.在JavaScript中计算nonce的SHA1哈希值,将值复制到隐藏字段中.当用户POST表单时,他们现在使用nonce值发回cookie.从cookie中计算nonce的SHA1哈希值,与隐藏字段中的值进行比较,并验证在过去15分钟内是否生成了该nonce(memcached对此有利).如果所有这些检查都通过,请发表评论.
这种技术要求垃圾邮件发送者坐下来确定发生了什么,一旦他们这样做,他们仍然必须发起多个请求并保持cookie状态以获得评论.另外,Set-Cookie
如果他们首先解析并执行JavaScript并发出AJAX请求,他们只会看到标题.这比大多数垃圾邮件发送者愿意接受的工作要多得多,特别是因为这项工作仅适用于单个网站.最大的缺点是任何关闭JavaScript或禁用cookie的人都被标记为潜在的垃圾邮件.这意味着审核队列仍然是一个好主意.
从理论上讲,这可以通过默默无闻来获得安全性,但在实践中,这是非常好的.
我从来没有见过垃圾邮件发送者努力打破这种技术,虽然可能每隔几个月我就会手动输入一个主题垃圾邮件,这有点怪异.
这里提到的所有解决方案都是通过人工解算器方法来规避的.一个专业的spambot会保留数百个连接,当它无法解决CAPTCHA本身时,它会将屏幕截图传递给远程人工解算器.
我经常读到CAPTCHAs的人工解决方案违反法律.嗯,这是由那些不知道这个(垃圾邮件)行业如何运作的人写的.
人工解算器不直接与他们解决的CAPTCHAs站点进行交互.他们甚至不知道CAPTCHA是从哪些站点获取并发送给他们的.我知道有数十家(如果不是数百家)公司或/和提供人工解算器服务的网站,但没有一家网站可以直接与董事会互动.
后者不违反任何法律,因此CAPTCHA解决完全合法(和官方注册)的商业公司.他们没有犯罪意图,例如,可能用于远程测试,调查,概念验证,原型设计等.
AI(人工智能)机器人在不同时间(不同国家/地区)的不同IP地址确定上下文并维护上下文敏感对话.甚至博客的作者也经常不理解评论来自机器人.我不会详细介绍许多细节,但是,例如,机器人可以网络化人工对话,将它们存储在数据库中,然后简单地重复使用它们(逐个词组),因此它们不会被软件甚至人类检测为垃圾邮件.
投票最多的回答是:
*"理论是:
垃圾邮件机器人不支持JavaScript并将提交它看到的内容
如果机器人支持JavaScript,它将立即提交表单
评论者在发布"*之前至少阅读了一些页面
以及蜜罐回答和这个帖子中的大多数答案都是完全错误的.
我敢说他们是受害者注定的方法
大多数垃圾邮件程序通过来自不同IP(不同国家/地区)的本地和远程javascript感知(修补和管理)浏览器工作,他们非常聪明地规避蜂蜜陷阱和蜜罐.
不同的问题是,即使博客所有者也不能经常检测到评论来自机器人,因为它们实际上来自人类对话和从其他网络收集的评论(论坛,博客评论等)
对不起,我删除了这部分作为沉淀的部分