首页 理论教育数据验证码:防止自动发帖,提高数据安全

数据验证码:防止自动发帖,提高数据安全

【摘要】:早期的数据验证码是为了防止自动发帖软件而采取的一项技术,它能够有效地防止非人为的发帖行为,提高数据的安全性和完整性。大体上验证码共分为2类,即使用数字或字母的国际化验证码和使用中文汉字的验证码。改变buildImageVerify方法参数可以改变验证码的显示样式。表8-2 buildImageVerify方法参数生成普通验证码非常简单,只需要使用引入系统扩展类即可。

数据验证码是一项运用非常广泛的技术,尤其在登录系统中数据验证码无处不在。早期的数据验证码是为了防止自动发帖软件而采取的一项技术,它能够有效地防止非人为的发帖行为,提高数据的安全性和完整性。现在的数据验证码可以用在多种场合中,有些对安全性要求极高的登录系统还将验证码技术结合硬件技术,实现更高级的应用。验证码技术经过多年的发展,越来越成熟,越来越多样化,比较常见的有数字或字母验证码、语音验证码、问题对答验证码、日期验证码等。

接下来介绍的验证码是基于ThinkPHP内置的验证码,它能够解决一般数据提前所需要的安全验证,包括纯数字验证、英文字母验证,数字和英文混合验证、中文验证等。验证码又可以按长短、大小写来区分,接下来将详细介绍系统内置的验证码功能。

1.生成验证码

验证码通常是由GD基础类库结合Session实现的一组图片信息,所以要使用验证码需要确保PHP已支持GD库(5.0以上版本已默认支持)。ThinkPHP通过扩展的方式提供验证码功能,所以在初始化验证码时首先需要引入Image系统类库(路径为ThinkPHP/Extend/Library/ORG/Util/Image.class.php),该类库存放了所有关于图片处理的方法(事实上就是对GD基础类库部分功能的封装)。大体上验证码共分为2类,即使用数字或字母的国际化验证码(下称普通验证码)和使用中文汉字的验证码。下面分别介绍。

(1)生成普通验证码

普通验证码是最通用和常用的一种验证码,也是一种最简单易用的验证码。用于生成普通验证码的方法为buildImageVerify,该方法是Image系统扩展类库的成员静态方法,共有6个参数,表现形式为buildImageVerify($length,$mode,$type,$width,$height,$verifyName)。改变buildImageVerify方法参数可以改变验证码的显示样式。如表8-2所示。

表8-2 buildImageVerify方法参数

978-7-111-42852-7-Part02-309.jpg

生成普通验证码非常简单,只需要使用引入系统扩展类即可。假设需要生成一个混合型的验证码,只需要将mode参数设为5即可,如以下代码所示。

978-7-111-42852-7-Part02-310.jpg

如上述代码所示,import函数是一个引入第三方或系统扩展类库的函数。引入Image类库之后,由于buildImageVerify方法是一个静态方法,所以不需要实例化。最终的验证码效果如图8-2所示。

978-7-111-42852-7-Part02-311.jpg

图8-2 验证码

(2)生成中文验证码

中文验证码是一种防猜测更强的验证码,它解决了普通验证码容易被破解导致安全性低的问题,近年来在国内的主流网站中均已被采用,例如QQ安全中心、新浪微博等。中文验证码在国内被广泛采用的根本原因是它与普通验证码相比,防破解能力更强,字体更友好,适合中文网站使用。与语音或多媒体验证码相比,它更直观,终端设备上不需要特殊要求。但是中文验证码也有缺点,最显著的就是中文验证码只适用于面向中文地区的用户。

Image类库中的GBVerify静态方法用于生成中文验证码,使用该方法生成中文验证码是基于字库的,系统并没有自带字库,所以如果需要正确地生成中文字符,首先需要字库。读者可以在网上搜索下载,或者在Windows系统里的C:\Windows\Fonts目录中选择,不同的字库将会显示不一样的文字效果,最后将字库文件复制到ThinkPHP\Extend\Library\ORG\Util扩展目录中。完成上述步骤后就可以使用GBVerify方法了。

GBVerify方法共有6个参数,形式为GBVerify($length,$type,$width,$height,$fontface,$verifyName)。改变参数的值将改变中文验证码的生成效果,如表8-3所示。

表8-3 GBVerify方法参数(www.chuimin.cn)

978-7-111-42852-7-Part02-312.jpg

这里为了方便演示,将使用C:\Windows\Fonts\simhei.ttf字库。有了中文字库,生成中文验证码将变得非常简单,如以下代码所示。

978-7-111-42852-7-Part02-313.jpg

最终的文字是随机的,并且会被加密后存放于Session中。效果如图8-3所示。

978-7-111-42852-7-Part02-314.jpg

图8-3 中文验证码效果

需要说明的是,无论是普通验证码还是中文验证码,GD库生成图片依赖于浏览器Head头信息,所以在Head之前不能有任何的输出,否则将导致生成失败。这也就意味着验证码动作之前或之后都不能有任何的数据被输出,为了保险起见,可以将验证码定义在入口文件中。

2.使用验证码

无论是普通验证码还是中文验证码,最终的文件都是一个图片文件。所以在使用时直接为img标签赋予图片路径即可,如以下代码所示。

978-7-111-42852-7-Part02-315.jpg

978-7-111-42852-7-Part02-316.jpg

如上述代码所示,自定义show脚本函数是用于实现验证码切换(即点击验证码会随机重新分配验证码)。最终效果如图8-4所示。

978-7-111-42852-7-Part02-317.jpg

图8-4 验证码使用效果

上述登录表单将提交到post动作中,在post动作中需要对验证码进行验证,以确保用户输入的验证码有效和正确。如以下代码所示。

978-7-111-42852-7-Part02-318.jpg

978-7-111-42852-7-Part02-319.jpg