验证码的存在是一个错误——论非人为操作的可识别性

很早以前我就思考一个问题:验证码在理论上是否有存在的必要性呢?

从验证码第一次被应用于网络中,早期的验证码是一串非常简单的形状标准的数字,经过长期的发展,形式越来越多样化,人们似乎已经习惯了,没有人去质疑它有什么问题,更没有人去思考它是否有存在的必要。复杂的验证码虽然起到了防范非人为操作的作用,但是带来的时间及效率上的损失更是巨大的。的确,它不是一个错误,但是我们从效率上来考量,它就是一个累赘。我们有必要让人们从繁琐的辨认、输入、输错重输的严重耗费时间的劳动中解放出来。

人为操作与机器操作(非人为操作)的区别也许有点隐晦,但是否不可能区别呢?我们可以设想一下,在一栋高科技大楼中你需要通过一道电子门,而这个门有一个识别程序,当通过者判定为人类才可以打开,如果是机器人那么就不开门。而你作为一个活生生的人类站在这道门前,却需要回答一个可笑的问题:"请问8+2=?" ,当你准备输入了10的时候,却按错了一个按键,门锁住了。这时候来了一个机器人,它同样准确无误地输入了10,这时候门打开了。这是不是一个看起来一个很愚蠢的电子门呢?我想大部分人在此都会自然而然的发出质疑:难道区分人类和机器就一定要用这种看似可笑的问题吗?为什么不从人类与机器的本质不同上加以区别呢,比如人类的生命体征、人体的热辐射等等...

其实现在的验证码就在做和这道电子门同样的事——在铁路订票的网站上煞费苦心弄出来一套奇形怪状的验证码,人眼都难以识别,机器是否不能识别还存疑。在一个偶然的机会之前,我曾一直困惑在机器与人为操作的结果都是对服务器发送请求,而如果在结果这一步,人为操作的痕迹已经完全没有了,换句话说,发送网络请求的时候是无法验证请求操作是来自人还是机器。那么我们考虑网页上当一个人类用户去输入文字的时候,有这样一个过程:光标从别处移入到可输入框内,光标变成一个"I形"的可输入符,点击鼠标左键,光标再次变成闪烁的输入提示符,重复(按下键盘按键,按键抬起),完成输入。这个过程是机器不会去做的,所有的自动登录的软件都是直接发送请求到服务器,机器并不需要去模拟鼠标移入这个动作,因为没有任何意义(至少在本文发出去前是这样)。而这个人为动作我们就可以拿来用于识别是人还是机器。我们在页面的脚本代码中加以验证鼠标是否在移入了指定的输入框时状态发生了改变?如果鼠标变成了输入符,则继续验证:是否在这之后点击量鼠标左键,如果有,则进入输入状态,继续验证:在输入状态下是否有按键按下和抬起?在按键按下和抬起中可以记录按下了哪一个键,然后在按键抬起的时候与真实输入框内的字符进行比较是否一致(好在现在的密码是没有中文字符的),如果一致则认为是一个人工的输入,之后在最后点击按钮的时候可以再次进行综合验证。思路就是这样,当然聪明的程序员可以把这个验证过程加以完善,我相信可以做到不需要验证码一样可以完全识别出有效的人为操作。我之后有空会给出一个实例。

时间: 2024-10-12 08:00:04

验证码的存在是一个错误——论非人为操作的可识别性的相关文章

验证码有存在的必要吗?——论非人为操作的可识别性

从验证码第一次被应用于网络中,早期的验证码是一串非常简单的形状标准的数字,经过长期的发展,形式越来越多样化,人们似乎已经习惯了,没有人去质疑它有什么问题,更没有人去思考它是否有存在的必要.复杂的验证码虽然起到了防范非人为操作的作用,但是带来的时间及效率上的损失更是巨大的.的确,它不是一个错误,但是我们从效率上来考量,它是一个累赘.我们有必要让人们从繁琐的辨认.输入.输错重输的严重耗费时间的劳动中解放出来. 很早以前我就思考一个问题:验证码在理论上是否有存在的必要性呢? 人为操作与机器操作(非人为

VS2010添加类失败问题,弹出错误框,提示 CodeModel操作失败,无法访问标记数据库

我在使用VS2010添加类的时候,会弹出一个错误框,提示 CodeModel操作失败,可以无法访问标记数据库 英文版是 CodeModel operation failed,Possibly cannt access Tag database. 添加类很是麻烦.      后来到网上搜索了下,终于在 一个论坛找到了解决方法,记录在这里备忘. 解决方法: 1.删除解决方案所在文件中的*.sdf文件                      2.删除解决方案目录中Ipch下的文件         

Spring中的一个错误:使用Resources时报错(The annotation @Resources is disallowed for this location)

在学习Spring的过程中遇到一个错误:在使用注解@resources的时候提示:The annotation @Resources is disallowed for this location 后来来在学问Java网友的时候解决了. 原来的代码是这样的: 1 package com.show.biz; 2 3 import javax.annotation.Resources; 4 5 import com.show.biz.UserBiz; 6 import com.show.dao.Us

VS2013 C# 调用 cognex 的QuickBuild做程序时发生一个错误

今天在用 VS2013 C# 调用 cognex 的QuickBuild做程序时发生一个错误,如下所示 混合模式程序集是针对"v2.0.50727"版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集 网上搜索得到解决办法: 在app.config中添加一个配置节:startup <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime

jsonkit 分解nsarray 时刻 一个错误

jsonkit 分解nsarray 时刻 一个错误 Assertion failure in -[TXJKArray count], /Users/mqq/hudson/1740/src/TencentOpenApi_IOS/Common/Util/JSONKit.m:738 解决的方法: Had the same issue, I was trying to set the output straight to a dictionary I had created. myDictionary

转:《链接、装载与库》里的一个错误:关于调用栈

<链接.装载与库>里的一个错误:关于调用栈 按照原文中描述做了一个PPT: 每次执行push指令时,esp都会减4(因为栈是向低地址增长的),每次pop时esp都会加4. 指令:push a 指令:push b 指令: 1.把main方法当前指令的下一条指定地址(即return address))push到栈中. 2.使用call指令调用目标函数体. 指令:将ebp的当前值push到栈中,即saved ebp. 指令:将esp的值赋给ebp,则意味着进入了foo方法的调用栈. 指令:push

处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”

开发web项目时需要安装IIS,在安装好IIS的Windows7本上发布asp.net网站时,web程序已经映射到了本地IIS上,但运行如下错误提示"处理程序"PageHandlerFactory-Integrated"在其模块列表中有一个错误模块"ManagedPipelineHandler"" 我要发布的的web项目开发工具及所用系统 ①开发工具:vs2010.数据库:sqlserver ②操作系统:windows7 ③IIS:IIS 7.5

spring-framework-3.2.4.RELEASE 综合hibernate-release-4.3.5.Final一个错误Caused by: java.lang.NoClassDefFound

LZ一体化的今天spring-framework-3.2.4.RELEASE 综合hibernate-release-4.3.5.Final一个错误Caused by: java.lang.NoClassDefFound Caused by: java.lang.NoClassDefFoundError: org/hibernate/service/jta/platform/spi/JtaPlatform. 最后从国外一篇文章找到解决的方法:原文地址例如以下:点击打开链接 产生原因是: Hibe

HTTP 错误 500.21 - Internal Server Error 处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”

HTTP 错误 500.21 - Internal Server Error 处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler” 原因:在安装Framework v4.0之后,再启用IIS,导致Framework没有完全安装 解决:1.先找到 aspnet_regiis.exe文件,先看看这个文件在什么位置, 2.开始->所有程序->附件->右键点击“命令提示符”->以管理员身份运行-&