9

我在这里寻找灵感。我需要对我的网站进行某种人工验证,但如今最常用的方法(要求用户将他们在图像中看到的字母和数字输入到文本输入框中)似乎有点垃圾 -我有时觉得很难找出字母和数字是什么。

一定会有更好的办法!

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

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

或者

(展示动物图片)“哪种动物会飞?”

这具有易于编程的优点,并且希望易于通过。

谁能想到解决这个问题的任何其他方法?或者可能发现上述系统中的缺陷?是否有可能让这样的系统既让人类更容易通过,又让机器人更难通过?

4

4 回答 4

3

虽然它有点老了,但我真的发现KittenAuth是一种有趣(而且可能非常有效)的验证码方法。不过,他们的联系页面上似乎只有一个演示。

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

作为 KittenAuth 的一个有趣的小骑手,这个页面有“有史以来最糟糕的 10 个验证码”,包括我最喜欢的一个:

微积分验证码

于 2009-09-19T14:45:18.480 回答
1

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

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

技术还没有那么先进,以至于带宽敏感的机器人能够回答这样的问题,但这个问题很容易回答。用户必须输入 3 或 3 以验证他们是人而不是机器。您必须有足够多的问题库,机器人不会简单地 ping 您的站点,查看要记录的问题,以便它可以返回手头的答案。

于 2009-09-19T14:46:12.620 回答
1

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

但是这种东西可能会被滥用。给它一种文化偏见——或者一种被感知的偏见并不难。

而且,正如austin cheney所展示的那样,它很容易成为一种智力测试,并且你会遇到可访问性问题。

于 2009-09-19T14:50:19.190 回答
1

尝试使用通过单击普通按钮(不是提交按钮)触发的基于 ajax 的提交过程,使用 jQuery 真的很容易。

据我所知,垃圾邮件机器人没有 javascript。

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

编辑:

另请参阅:实用的非基于图像的验证码方法?

但问题是,如果有人故意针对您的网站,这种技术将不起作用。

编辑2:

我无法提供指向现实生活示例的链接,但我在博客中提供了更多详细信息,所以这里有一些示例代码:

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
      });
}
于 2009-09-19T14:52:30.410 回答