看起来我们将为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>兼容的验证码,如果可能的话。
想法吗?
在我的博客上,除非有javascript,否则我不接受评论,而是通过ajax发布评论。它把所有的机器人挡在外面。我收到的唯一垃圾邮件来自人类垃圾邮件发送者(他们通常从站点复制并粘贴一些文本来生成评论)。
如果你必须要有一个非javascript版本,可以这样做:
下面字符串[y]中[x]的[某些操作]
给定一个足够复杂的[x]和[y],无法用正则表达式求解,那么编写解析器就很难了
数一下[dog,dangerous,danceable,cat]中短单词的个数= 2
在[dog,dangerous,danceable,catastrophe] = dog中最短的单词是什么
哪个单词以x结尾,[fish,mealy,box,stackoverflow] = box
在[apple.com, stackoverflow.com, fish oil.com] = fish oil.com中,哪个url是非法的
所有这些都可以在服务器端轻松完成;如果选项的数量足够大,并且频繁轮换,那么就很难获得所有选项,再加上永远不要每天给同一用户相同类型的内容超过一次
我必须承认我没有对抗垃圾邮件机器人的经验,也不知道它们有多复杂。也就是说,我在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,而不需要在每个请求上生成它们,那么另一种选择是离线预生成它们。然后你只需要随机选择一个来显示每个表单。