替代验证码方法

时间:2009-09-19 14:32:56

标签: captcha

我在这里寻找灵感。我需要对我的网站采用某种人工验证,但是现在最常见的方法(要求用户输入他们在图像中看到的字母和数字到文本输入框中)似乎有点垃圾 - I发现很难有时会弄清楚字母和字母是什么数字是。

一定有更好的方法!

我有一些想法,最好的一个似乎是向用户展示一系列图像(4-6),并要求他们根据图像的内容回答问题,例如:

(显示一些几何形状)“哪个图像有3个边?”

(显示动物的图片)“哪种动物可以飞?”

这样做的好处是易于编程,并且希望很容易通过。

有人能想到解决这个问题的其他方法吗?或者可能在上面列出的系统中发现缺陷?是否有可能使这种系统更容易让人类通过,并且机器人更难通过?

4 个答案:

答案 0 :(得分:2)

虽然它有点陈旧,但我确实发现KittenAuth是一种有趣(可能非常有效)的验证码方法。但是,似乎只有一个demo on their contact page

基于纯图像的方法(与文本图像相对)的问题在于,您基本上是在阻止盲人用户使用您的网站。 KittenAuth作者在其网站上的一条评论中承认了这一点。

作为KittenAuth的一个有趣的小骑手,this page有“有史以来最糟糕的10个,”包括我最喜欢的一个:

calculus captcha

答案 1 :(得分:1)

尝试使用问题挑战系统,其中一个简单的问题需要简单的认知反应。例如,要求用户回答以下示例问题:

街上的三辆车可以看到另外三辆车。那里有多少辆汽车?

技术不是那么先进,以至于带宽敏感的机器人能够回答这样的问题但问题很容易回答。用户必须输入三或三才能验证他们是人,而不是机器。你需要有足够多的问题,机器人不会简单地ping你的网站查看要记录的问题,以便它可以随时回答。

答案 2 :(得分:1)

我特别喜欢“哪种动物可以飞”的例子。简单&有效的。

但是这种事情可能会被滥用。给它一个文化偏见 - 或一个被认为的偏见也不难。

并且,正如austin cheney所示,它很容易成为一种智力测试,并且您会遇到辅助功能问题。

答案 3 :(得分:1)

尝试使用基于ajax的提交过程,该过程通过单击普通按钮(而不是提交按钮)触发,使用jQuery非常简单。

据我所知,spambots没有javascript。

如果您担心没有启用JavaScript的用户,我认为让他们无法提交表单是完全可以的。如果他们不相信您在您的网站上启用javascript,那么他们无法在最大程度上使用该网站并不是您的错。

编辑:

另见:Practical non-image based CAPTCHA approaches?

问题是,如果某人故意瞄准您的网站,这种技术将无效。

EDIT2:

我无法提供实际示例的链接,但我blogged关于它的更多细节,所以这里有一些示例代码:

function submit_form()
{
    jQuery.ajax({
      "type": "POST", // or GET
      "url": 'action_url', // The url you wish to send the data to, the url you'd put in the "action" attribute on the form tag
      "data": jQuery("form#the-form").serialize(), // The data you'll send. You need to get the form somehow. Easiest way is to give it an id.
      "dataType": "json", // Only put this if the server sends the response in json format
      "success": function(data, textStatus) // server responded with http status 200
        {
            // This is the happy case: server response has arrived
        },
      "error": function(req, textStatus, errorThrown) // maybe HTTP 404 or HTTP 500
        {
            // something went wrong, the response didn't go through or the response didn't come. Handle the situation: let the user know, or something.
        },
      "complete": function(req, textStatus) // This one always gets called anyway
        {
            // cleanup after yourself
        }   // XXX careful: if you put a comma here, IE6 will fail
      });
}