验证码技术在网站中的应用
为了防止某些别有用心的用户利用机器人(恶意程序)自动注册、自动登录、恶意灌水、恶意增加数据库访问、用特定程序暴力破解密码,可采用验证码技术。
另外一个好处是,使得你的网站给人一种很酷的感觉。
验证码应用原理:
浏览器应用HTML标准与网站服务器动态联系,在HTML的表单中,基本上都是使用指定有Action的POST方法。如果不应用验证码方法,将很容易被一些别有用心的人利用机器人程序或者盗用Action的恶意程序,实现其个人勾当。应用验证码技术后,可以保护你的服务器,防止这一问题的发生。
应用验证码技术后,表单上将多出一个验证码文本框输入项目,并且表单上的某个位置还显示有一个图片,这个图片是由一些可由人工识读的数字和字符组成的。这是应用验证码技术后的前台特征。后台特征是,服务器在生成验证码图片的时候,以Session或者其它方式在服务器端保存验证码的明文字符串。
用户在输入表单内容的时候,还要求用户识读表单上的这个的验证码图片并将识读结果输入到验证码文本框内。当服务器收到这样的表单后,首先将用户提交的验证码与Session值进行比较,根据比较结果判断用户是否为合法使用网站功能。
验证码应用注意事项:
为了防止电脑OCR读图程序识别和破解验证码,一般需要在合理范围内适当增加对验证码图片的识别难度。处理手段主要是对色彩、形状、干扰元素、位置进行变异处理,使得生成的验证码图片不具有程序阅读的规律性。目前常用方法有:数字和字母混合、随机产生字符个数、随机扭曲翻转字符、随机增加背景噪点、随机添加干扰条纹、随机变化字符在图片上的位置、随机变化背景颜色和字符颜色、随机变化字符大小、随机变化字符间距,等等。在增加识别难度上需要掌握好度。如果用户太难识别验证码了,会影响用户对网站的使用积极性。
网站应用验证码后,将增大服务器压力,具体表现在两个方面。一是因为生成验证码时使用了许多的算法,生成验证码过程中会占用服务器CPU时间,二是应用Session会消耗服务器内存。所以,并不是在网站中到处都用。目前主要是在重要表单提交时使用。
服务器生成的验证码明文不能保存在客户端浏览器上,否则被用户读取后就失去了验证的作用。
验证码技术,对传统的HTML标准的表单是具有显著防护作用的。在ASP.NET和其它技术飞速发展的今天,可以通过许多其他的方法达到同样的目的。如ASP.NET就应用了全新的Form技术,摒弃了Form的Action,对表单上的按钮Handles事件,通过该事件的服务器程序处理表单动作。再譬如。分步骤提交表单也可达到保护目的。所以说,验证码技术将很快退出历史舞台。
验证码式样:
本文示例程序可提供的式样及可实现的功能:
标准式样:
背景颜色随机变化:
干扰线条随机变化:
干扰噪点随机变化:
扭曲程度随机变化:
首字符位置随机变化:
随机增加3D阴影:
字符数量随机变化:
字体大小随机变化:
Yahoo验证码式样:
CSDN验证码式样:
Sina验证码式样:
凤凰网验证码式样:
验证码生成方法:
1、随机产生一定长度的字符;
2、使用System.Drawing命名空间的Graphics类的方法将字符绘制成图片;
3、在第二步的基础上,使用各种方法对图片进行各种操作,使之复杂化,增加识别难度。
验证码应用前台程序:
以下是代码片段: <body> <form id="form1" runat="server"> <div> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> <asp:Image ID="Image1" runat="server" ImageUrl="VerifyChar.aspx" /><br /> <br /> <asp:Button ID="Button1" runat="server" Text="提交" /></div> </form> </body> |
验证码图片生成程序:
以下程序在VS2003和VS2005下通过。
以下是代码片段: Imports System.IO Partial Class VerifyChar Private Const PI As Double = 3.14159265358979 ’生成随机背景颜色 ’在图片框picCanvas上面建立一个新的空白Graphics ’填充位图背景 ’随机输出噪音线 ’随机输出噪点 ’文字的位置 ’随机画3D背景 ’将全局变换平移(x, y),也就是使画布上将要画的所有内容向左边移动x,向下移动y ’做切变,将原始矩形的下边缘水平移动矩形高度的0.2倍 ’画出文字 ’扭曲验证字符。TwistImage参数可自行修改 ms = New MemoryStream End Sub Dim i As Integer ’ 取得当前点的颜色 Dim color As System.Drawing.Color = srcBmp.GetPixel(i, j) Return destBmp |