阻碍你抢票的“罪魁祸首”竟然是他?
我们在使用互联网的过程中,可以看到网站往往会通过验证码来辨别用户是否是机器人,验证码实际上就是人类和计算机的一场战争。但有时候你会发现,验证码也是让人感到十分无奈,有的时候严重扭曲到不能通过人眼来识别。
随着电脑信息技术的飞速发展,有效图像识别技术已经被开发出来,但目前大部分网站使用的文本验证码还是有用的。尖端的图像识别技术需要花费大量时间金钱成本,黑客们是不会用它们来破解你的博客、窥探你中午打算吃什么的。只有那些涉及机密、金钱利益的网站,比如网上银行、购物网站等受到了较大的威胁。为了防止财产损失,这些网站纷纷推出了各种进化版的验证码。主流的验证码都是静态图片,有些网站推出了动态的验证码,令机器人很难捕捉,同时动画效果能够增加网页的美观程度。很多大型的购物网站要求发送手机短信验证码,确保操作用户是本人。又或者是问用户一个常识性的问题,比如“牛奶和汽油哪个可以喝?”——总之就是一些机器不会、但是人类可以轻易做到的事。
12306购票网站曾经因为更换了一种“超难”的图形验证码而在各媒体报纸上大出风头。大家都知道,节日期间的火车票很难买,而众多抢票软件更是火上浇油,令网络购票变得更加艰难、混乱。为了拦截住那些违反公平的抢票软件,12306网站推出了这种让人大呼“坑爹”的验证码系统:系统要求想买票的用户在一堆图片里找出目标物体,比如便利贴、汉堡、玉米等常见事物,虽然很多人在不习惯的情况下觉得有点难,但这对于想钻空子的机器程序来说,更是难如上青天。
验证码也很年轻
一开始,网络上是没有验证码的。那时想要在论坛上发帖,只需轻轻敲一下回车键。然而,那个时代却没有大家以为的那么平静,当时的黑客也十分猖狂:他们编写了一种能够大量、重复编写信息的程序,伪装成人类用户,肆无忌惮地在网络上倾倒大量的、无意义的“僵尸”信息,垃圾邮件、垃圾广告、垃圾评论。论坛被灌水,有用的信息很快会被淹没,很多网站的正常运营遭到破坏。除此之外,还有数之不尽的程序机器人使用不断尝试的方法恶意破解密码、恶意刷票,从中获取非法的利益。强而有力的程序机器人如同霸王龙一样横行霸道,网络世界一片狼藉,眼看着就要失控了。
其中,受影响最大的当属电子邮件的提供商:他们的用户每天收到数以百计的垃圾邮件轰炸,严重地影响了正常的工作;更要命的是,这些垃圾邮件还是用他们的免费邮箱发出的。他们不可能一一审查邮件,因为那既不尊重隐私,工作量也太大。难道就没有任何手段约束程序机器人了吗?当时最有实力的邮件提供商Yahoo(雅虎)公司决定下狠劲改善这个问题。很快,雅虎的负责人联系到了当时卡内基梅陇大学一位21岁的学生,他叫路易斯·冯·安(Luis von Ahn)。
路易斯是一个计算机天才,17岁进入卡内基梅陇大学,在大学时期,他凭借良好的表现获得了导师曼纽尔·布鲁姆(Manuel Blum)的赏识,他的傲人履历也很可能是雅虎向他伸出橄榄枝的原因。
在研究过程序机器人的“工作手法”之后,他给出了一个独特的方案:在用户进行操作之前,就将那些机器人从正常用户里揪出来。大家都知道图灵测试的目的是将机器伪造成人类,而路易斯的方案就是“反”过来:通过简单的方法将试图伪装成人类的程序机器人鉴定出来。
路易斯发现,人类可以用肉眼很轻易地识别图片里的文字信息,而机器就不能。当时的计算机辨识技术还很落后,对于那些镶嵌在图片中的、被扭曲过、污染过的文字无法辨识,而人类只需要稍稍皱眉就可以识别出来。路易斯在导师布鲁姆的帮助下很快设计了一个程序,它先是产生一个随机的字符串,比如smwm,然后对这串字符进行随机的扭曲、重叠、污染,再显示给要进行操作的用户。只要能够识别这个变形了的smwm的,就是人类。
这个设计方案后来被命名为“CAPTCHA”,这是“Completely Automated Public Turing test to tell Computers and Humans Apart”首字母的缩写,意思是“全自动区分计算机和人类的图灵测试”,虽然看上去很夸张,但实际上还是挺简单易懂的。它的中文译名就是大家熟知的“验证码”啦。
- (66) 理解synchronized / 计算机程序的思维逻辑
- 用Python搭建一个校园维基网站(一)
- (67) 线程的基本协作机制 (上) / 计算机程序的思维逻辑
- 制作Aspose CHM文档的过程记录
- 用python搭建一个校园维基网站(二)—— 可编辑内容的首页的创建
- Django博客教程(四):让 django 完成翻译—迁移数据库模型
- Calendar类中add/set/roll方法的区别
- 如何构建一个分布式爬虫(理论篇)
- Python微型Web框架Bottle源码分析
- VirtualBox相关问题总结
- Java 枚举7常见种用法
- ALI的Tensorflow炼成与GAN科普
- LaTeX内容总结
- (60) 随机读写文件及其应用 - 实现一个简单的KV数据库 / 计算机程序的思维逻辑
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- [AWR报告]Library Hit %
- [Oracle 9i安装]Redhat 4.8的配置
- [Oracle 9i安装]Oracle软件的安装
- [AWR报告]Latch Hit %
- [Python运维]Python3.6的安装
- [Python运维]cx_Oracle模块的安装
- C#中抽象类与抽象方法的作用与实例
- C++ 基础扫盲(1)
- [Python运维]使用cx_Oracle连接Oracle(高级篇)
- [Python运维]使用Python发送邮件
- [Python运维]自动化监控Oracle表空间并发送报警
- [Python运维]自动化监控多个Oracle表空间
- c# 动态生成控件
- C# 10分钟完成百度人脸识别——入门篇
- C#开启线程的四种方式