IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

浅谈Web安全验证码

2016-12-22 23:24:35 累计浏览 3,487 次
本机暂存

   春运又称“年度全球最大规模的人口流动”,是一部“人民的斗争史”,起初只是与黄牛斗智斗勇,后来为了整治黄牛12306不断升级验证码,于是大家开始了与验证码斗智斗勇。那么这种验证码是否是必须的?且看小编对Web安全之验证码的解读。

   为防止服务器端的资源被客户端的计算机程序滥用或攻击,服务器需要区分当前用户是计算机还是人类,一般在网站的关键操作位置都会采用验证码技术来区分。围绕验证码展开的攻防技术在Web安全中有着重要地位,本文将从验证码的工作原理出发,介绍验证码实现上容易产生的问题,并对其攻防技术现状和未来做一个简要介绍。

前言

   全自动区分计算机和人类的图灵测试(Completely Automated Public Turing test to tell Computers and Humans Apart,简称CAPTCHA),俗称验证码,是一种区分用户是计算机或人的全自动化程序。在CAPTCHA测试中,作为服务器端的计算机会自动生成一个问题由用户来解答。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。

   在以前的网络访问中,还不存在验证码的用法,但由于网络更加深入地融合到人们的生产生活中,暴力猜测登陆,垃圾广告贴等在网络中泛滥,消耗了大量的服务器资源同时也可能威胁到服务器的安全,验证码作为一种实用高效技术被大量使用起来。

   Web安全的攻击与防护技术一直是互相促进的,验证码识别技术的不断发展推动着验证码生成技术的提高。本文将从验证码技术的原理出发,介绍验证码容易出现的问题以及相关识别技术,以使读者对验证码攻防技术有一个了解。

工作原理

   常见的图形验证码是与web中的会话相关联的,在一个会话开始时,在需要使用验证码的地方会生成一个与当前会话相关的验证码,用户识别出验证码后通过填写表单将数据提交给服务器,服务器端会验证此次会话中的验证码是否正确。具体来说,其工作流程如图1所示:

图1 验证码技术工作原理

   对用户方来说,用户访问起始页面,识别返回页面中的验证码,在输入验证码和其他信息后提交表单,在服务器处理后可查看到当前操作是否成功。

   服务器在接收到用户对初始页面的请求后,会自动创建一个新的会话,同时生成验证码来关联这个会话,并且生成用户可见到的验证码图片,最后这些页面返回到用户的浏览器上,用户此时可看到完整的页面;在接到用户提交的表单请求时,服务器会比较用户提交的验证码值并与之前存储在此会话下的验证码值做比较,如果一致判断验证码是正确,否则认为提交的验证码是错误的,可能是客户端是计算机或者用户识别错误。服务器端进行这些处理后将处理结果反馈给用户。如果提交的验证码是正确的,则按照预定流程进行下一步骤,否则回到需要用户输入的那个界面上。

存在的问题

   验证码作为区分人与机器的一道重要屏障,与之相关的对抗技术一直在WEB安全研究上有着重要意义。图片验证码生成算法以及程序实现流程上都有可能带来问题,容易被攻击者突破。

   图片验证码的生成可能存在如下问题:
1) 图片验证码的字符空间小
如果选取的字符空间较小,则让验证码识别变得相对简单。字母数字组合的字符集比单纯为数字的字符集效果要好。
2) 图片中的字符规则
字符进行变形,扭曲不利于程序的识别,而对人眼识别是无障碍的,但此方法对生成程序来说有一定的难度。
3) 图片中缺少干扰图案
干扰图案能有效增加验证码的识别难度,并且对生成程序来说代价小。

   在验证码的程序实现流程方面可能存在如下问题:
1) 验证码固定
一般地,用户在开始访问初始页面时,浏览器会向服务器发起页面请求,服务器此时创建会话,同时返回的页面里会嵌入验证码图片地址,浏览器在加载响应页面后,会自动加载验证码图片地址。服务器在接收到验证码图片地址的请求时,会对当前会话生成一个对应的验证码并且返回验证码图片。用户此时根据就可根据验证码图片信息填写表单数据来进行后面的操作,这时,服务器如果检验出提交的验证码是错误的,服务器会返回页面提示错误然后跳转到初始页面,因初始页面内嵌了验证码图片地址,浏览器再次自动刷新验证码页面。
如果验证码输入错误,会在上面的流程里自动刷新验证码,正常情况下,这个过程看起来是没有问题的。但是,由于HTTP请求响应式的工作原理,使得攻击者有可能控制验证码生成页面请求不被触发,使得在服务器上同一会话内,服务器端保存的此会话下的验证码一直有效。
基于此,服务器端的正确处理应该是在验证码检验失败时,就需要设置此验证码失效,同时对生成的每一个验证码也需要设置有效期。
2) 验证码的字符串值出现在返回的响应中
这是属于程序编码考虑不当导致,比如忘记注释掉调试信息导致。验证码可能出现在响应包中的Cookie, URL, 页面注释,甚至验证码在展示的时候直接就是文本方式,这样就完全失去了使用验证码的价值了。
3) 验证码长度可指定
在页面上存在参数可指定验证码的位数,这可简化识别工作。此问题的出现也可能是调试的需要,并发布时忘记注释掉相关代码而导致。

对抗现状

   自验证码技术问世以来,其成为自动化程序运行的第一大敌人。在利益的驱动下,突破封锁技术自然也会产生。一般来说,验证码的对抗技术有如下几个方面:

   1)避免触发验证码

   验证码的引入会带来用户友好度的下降,增加验证码输入以及人眼对验证码识别的可能错误等都会带来不好的使用体验。这对追求用户体验的网站来说,在没遇到可疑行为时,其采取的策略是默认不开启验证码功能,当触发可疑行为识别规则时,才会出现验证码。基于此原理,对攻击方来说,就是尽量避免触发可能出现验证码的规则。一般可疑行为识别是通过检查频繁尝试并且出错这个行为来进行,基于此的对抗措施则是使用不同的IP来进行尝试,或者等待足够的时间再次尝试,这样让目标网站程序认为这些尝试都是正常的访问请求,从而在自动化程序端连续作业时不会出现验证码而达到绕过的目的。

   2)验证码固定

   从前面的验证码固定问题描述可看出,攻击者可以在同一个会话下,在获得第一个验证码后,后面不再主动触发验证码生成页面,并且一直使用第一个验证码就可循环进行后面的表单操作,从而绕过了验证码的屏障作用。

   3)验证码机器自动识别

   计算机自动识别验证码,主要原理是通过一定的算法预先建立验证码范围内的字体特征库,再将要识别的验证码通过同样的算法生成特征,与之前保存的特征库进行比较,进而得到图片验证码的值。

   一般地,其识别过程有如下图所示的处理流程:

图2 验证码计算机识别过程

   A. 去噪处理
主要是去掉图像里的所有干扰信息,比如背景的点,线等。
B. 图像二值化
图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出黑白效果。图像二值化主要是为了将图像与空白区分开来,方便后续步骤的进行。
C. 切片处理
图片的切片处理是将每个字符所在区域分离成一个个的图片,确保一个图片内只有一个文字。
D. 文字图片标准化
对切片后的每个字符图片,还需要进行变形修复处理,比如旋转,缩放等操作尽量将每一个字符图片都调整到标准格式,减小随机度。
E. 字符模板识别
在最后的字符识别阶段,常用是通过模板对比的方法。模板的生成就是通过上述处理过程后,对给定图片处理后把生成的特征保存下来,并且人工识别输入其对应的字符。在用作识别阶段时,就与保存的每个字符特征模板进行比较,从中找出最相近的一个字符来。

   4)人工分布式识别
机器自动识别图片验证码,对简单的情况能有较高的准确率,但对干扰多,变形复杂的图片验证码,其准确率会很差。由于图片验证码重要度增加,复杂的图片验证码被大量使用,导致近年来出现了利用众包力量实现的人工验证码识别平台。
其工作原理图下所示:

图3 人工分布式识别

   自动化程序将要识别的验证码发送到打码平台,打码平台再将验证码发放给从事验证码识别工作的人员(俗称打码工作),在人工识别后再将值依次返回到自动化程序。由于是人直接参与了验证码的识别,此方法就让验证码完全失去了屏障功能。

验证码未来可能的主要形式

   随着验证码攻防技术的对抗升级,验证码技术也出现了一些新的发展动向。
从图片验证码自身的发展来看,主要是围绕增强人脑交互性来展开的,具体来说有如下几个方向:
1)增强干扰和字符变形
从验证码的机器识别可以看出来,增强干扰和字符变形能极大地提高识别难度。像下面的生成的图片验证码,对人眼识别来说都存在着一些难度。

2)拓展字符空间
常见的图片验证码都是数字或者字母,近年来出现了中文字符作为验证码,这样字符空间就增大了很多。

如果字符空间足够大,试图通过制作字符模板库方式来实现识别的难度就变得很大了。
3)增强与用户的互动性
通过增加与用户的互动也可增加难度,但因为这类互动都是通过问答题方式来实现,其题库数量是否足够以及是否具有足够的随机性则成为了关键所在。
如下图所示的问答型验证码:

   从验证码的信息传递途径和方式来看,有如下几个方式
1)增加信息传递途径也
在原来只通过网页来传递信息的基础上增加了其他传递方式,比如手机短信等。对于使用手机短信验证码,需要确保其关联的手机号不为攻击者所控制,否则也将失去保护意义。因为通过在手机里安装特定app软件就可以获得短信内容,这对于手机号码攻击者可控的情况下,验证码可轻松绕过;但如果其攻击场景是账号登陆类的,由于手机号码不可控,则使得暴力猜测变得不可能实施。扩展验证码的传递途径需要结合应用场景来使用,确保此途径不容易被攻击者获得。
2)利用动态令牌进行一次一密
通过动态令牌实现的一次一密方式,就必须通过人工交互才能实现,但此方式也增加了使用成本,只适用于密级要求很高的场合。
3)语音方式
语音方式在当前网络也有出现,但主要只是作为方便盲人使用的一个备用方案,但由于智能手机终端的广泛普及,以后也有可能成为一个主要的验证码发展场景。
随着技术的不断发展,以后还会出现其他方式的验证码,但可以肯定的是基于人脑的思维特性来区别于程序的预设特性,至于以后会如何发展,还是让我们拭目以待吧。

小结

   本文从验证码概念、工作原理入手,介绍了当前验证码的攻防情况,并且简要介绍了验证码的发展趋势。
喜大普奔的是中国铁路总公司为迎接2017年春运,铁路部门将对12306网站进行扩容改造,近期将推出在购票环节减少使用验证码的措施,近六成车票发售时旅客不再需要使用验证码,旅客购票体验将大为改善。
可以肯定的是,不管使用何种方式的验证码,都会影响用户体验,机器难以识别的验证码最后也会影响人眼的识别,验证码的设计者们需要在用户体验和安全性方面做一个折衷选择。寄希望于通过验证码来作为对抗机器自动化行为的唯一途径是不可取的,在识别自动化程序发起的远程Web扫描,登陆猜测等方面,推荐架设WAF类的专业防护产品。目前,绿盟科技的WAF产品能对此类问题提供完整的解决方案,有效阻挡即将发生的安全事件。

参考

   http://drops.wooyun.org/tips/141 常见验证码的弱点与验证码识别
http://zh.wikipedia.org/zh/%E9%AA%8C%E8%AF%81%E7%A0%81 验证码
http://drops.wooyun.org/tips/141 常见验证码的弱点与验证码识别

同分类推荐文章

  1. 绿盟科技《APT组织研究年鉴》(2026 版)正式发布 (2026-06-16 20:21:10)
  2. 【已复现】Linux内核Fragnesia权限提升漏洞(CVE-2026-46300) (2026-06-15 10:53:58)
  3. 企业文档安全最佳实践(二):给文档上“身份证”——手动标密与智能自动标密 (2026-06-12 17:18:33)

查看更多 安全 文章 →

建议继续学习

  1. 浅谈php web安全 (累计阅读 6,981)
  2. 跨域请求的iframe解决方案(1) (累计阅读 6,504)
  3. anti spam杂谈 (累计阅读 5,936)
  4. CI框架里用的验证码 (累计阅读 5,821)
  5. Cookie安全漫谈 (累计阅读 4,690)
  6. 验证码的几个常见漏洞 (累计阅读 4,357)
  7. 一段Javascript的代码 (累计阅读 4,334)
  8. 淘宝网:前端安全须知 (累计阅读 3,921)
  9. 一个Captcha的思路 (累计阅读 3,834)
  10. 字体文件也属于二进制文件 (累计阅读 3,776)