看起来我们将为Stack Overflow添加CAPTCHA支持。这对于防止机器人、垃圾邮件发送者和其他恶意脚本活动是必要的。我们只希望人类在这里发布或编辑东西!
我们将使用JavaScript (jQuery)验证码作为第一道防线:
http://docs.jquery.com/Tutorials:Safer_Contact_Forms_Without_CAPTCHAs
这种方法的优点是,对于大多数人来说,CAPTCHA永远不会可见!
然而,对于禁用JavaScript的人,我们仍然需要一个备用方案,这就是棘手的地方。
我为ASP编写了一个传统的CAPTCHA控件。NET,我们可以重复使用。
但是,我更倾向于使用一些文本化的东西,以避免为每个请求在服务器上创建所有这些图像的开销。
我见过这样的事情…
ASCII文本验证码:\/\/(_)\/\/
数学难题:7减3乘以2等于多少?
小问题:癞蛤蟆和冰棍,哪个更好吃?
也许我只是在风车这里倾斜,但我希望有一个更少的资源密集型,非图像为基础的<noscript>兼容的验证码,如果可能的话。
想法吗?
这里的一些人声称解决方案从未被机器人破坏过。我认为问题在于,你也不知道有多少人没有通过“验证码”。
一个网站不能变得对人类用户非常不友好。这似乎是在互联网上做生意的代价,你必须处理一些手工工作来忽略垃圾邮件。拒绝用户的验证码(或类似的系统)比根本没有验证码更糟糕。
Admittedly, StackOverflow has a very knowledgeable audience, so a lot more creative solutions can be used. But for more run-of-the-mill sites, you can really only use what people are used to, or else you will just cause confusion and lose site visitors and traffic. In general, CAPTCHAs shouldn't be tuned towards stopping all bots, or other attack vectors. That just makes the challenge too difficult for legitimate users. Start out easy and make it more difficult until you have spam levels at a somewhat manageable level, but not more.
最后,我想回到基于图像的解决方案:你不需要每次都创建一个新的图像。您可以预先创建大量(可能几千个?),然后随着时间的推移慢慢地更改这个集合。例如,每10分钟或每小时过期100个最旧的图像,并用一组新的图像替换它们。对于每个请求,从整个验证码集中随机选择一个验证码。
当然,这无法承受直接攻击,但正如前面多次提到的,大多数验证码都无法承受。不过,这足以阻止随机机器人。
我有一些想法想和你们分享……
避免OCR的第一个想法
一个验证码对用户来说有一些隐藏的部分,但完整的图像是两个代码在一起,所以OCR程序和验证码农场读取图像,包括可见部分和隐藏部分,尝试解码它们,但未能提交…-我已经准备好解决这个问题,并在网上工作。
http://www.planethost.gr/IdeaWithHiddenPart.gif
第二个想法,让它更容易
一页有很多单词,人类必须选择正确的一个。我也创建了这个,很简单。文字是可点击的图像,用户必须点击正确的图像。
http://www.planethost.gr/ManyWords.gif
没有图像的第三个想法
和以前一样,但是有div和文本或小图标。用户必须只点击正确的一个div/字母/图像,无论如何。
http://www.planethost.gr/ArrayFromDivs.gif
最终想法——我称之为CicleCaptcha
还有一个我的CicleCaptcha,用户必须在图像上找到一个点。如果他找到并点击它,那么是一个人,机器可能会失败,或者需要制作新的软件来找到解决这个问题的方法。
http://www.planethost.gr/CicleCaptcha.gif
欢迎任何批评。
我必须承认我没有对抗垃圾邮件机器人的经验,也不知道它们有多复杂。也就是说,我在jQuery文章中没有看到任何不能纯粹在服务器上完成的事情。
要改写jQuery文章的摘要:
When generating the contact form on the server ...
Grab the current time.
Combine that timestamp, plus a secret word, and generate a 32 character 'hash' and store it as a cookie on the visitor's browser.
Store the hash or 'token' timestamp in a hidden form tag.
When the form is posted back, the value of the timestamp will be compared to the 32 character 'token' stored in the cookie.
If the information doesn't match, or is missing, or if the timestamp is too old, stop execution of the request ...
如果您希望使用传统的图像CAPTCHA,而不需要在每个请求上生成它们,那么另一种选择是离线预生成它们。然后你只需要随机选择一个来显示每个表单。