宝哥软件园

深入研究如何生成和使用 net验证码

编辑:宝哥软件园 来源:互联网 时间:2021-09-27

小班:验证码的功能;

几年前,大多数网站、论坛等都没有验证码,因为对于普通用户来说,验证码只是增加了用户的操作,降低了用户的体验。然而各种灌溉机器人、投票机器人、恶意注册机器人层出不穷,大大增加了网站负担,给网站数据库带来了大量垃圾数据。为了防止各种机器人程序被破坏,程序员想出了一个只有人眼才能识别的验证码,但是程序不容易识别!

验证码是一张图片,它以字母、数字甚至汉字作为图片的内容,使图片的内容容易被人眼识别,但程序却无法识别。数据库操作前(如登录验证、投票、发帖、回复、注册等。),程序首先验证客户端提交的验证码是否与图片中的内容相同,如果相同,则进行数据库操作;如果不同,提示验证码错误,不执行数据库操作。所以各种机器人程序都被拒之门外!

但是,随着计算机科学的发展,模式识别等技术越来越成熟,编写机器人程序的家伙就可以通过程序识别图片中直接写的内容并提交给服务器,这样验证码就没用了。为了防止机器人程序被识别,验证码的图像生成不断发展。添加干涉点和干涉线,字符变形,角度和位置改变,颜色不同.防止计算机识别的各种技术也被应用于验证码。在这两种技术的竞争中,我们现在看到的验证码已经形成。很多人抱怨“这是什么验证码?人眼分不清是什么”,一切都是无奈的。

为了理解验证码的作用,让我们写一个验证码生成和使用的简单例子。

创建一个页面显示验证码,判断验证码输入是否正确。

html xmlns=' http://www . w3 . org/1999/XHTML ' head runat=' server ' title/title Script src=' http : scripts/jquery-1 . 4 . 1 . min . js ' type=' text/JavaScript '/Script type=' text/JavaScript '/单击切换验证码函数f _ refresh type(){ varimage 1=document . getelementbyid(' img ');if (Image1!=null) { Image1.src=Image1.src '?} }/script/head body form ID=' form 1 ' runat=' server ' div table tr TD asp3360 textbox ID=' textbox 1 ' runat=' server '/asp: textbox/Tdimg src=' http : png . aspx ' ID=' img ' onclick=' f _ refresh type()'//TD TDASP 3360 button ID=' button 1 ' runat=' server ' text=' ok '/TD/tr/table/div/

受保护的void page _ load(对象发送方,event args e){//生成的验证码保存在会话if (Session['CheckCode']!=null){ string check code=Session[' check code ']。ToString();if(this . textbox 1 . text==check code){ client script . registerclientscriptblock(this . gettype(),'',' alert('验证码输入正确!)’,真);} else { client script . registerclientscriptblock(this . gettype(),'',' alert('验证码输入不正确!)’,真);}}}生成验证码页面png.aspx

受保护的无效页面_加载(对象发送方,事件参数e) { if(!IsPostBack){ CreateCheckCodeImage(GenerateCheckCodes(4));} }公共void ShowAuthCode(Stream,Stream out字符串代码){ Random Random=new Random();代码=随机。下一个(1000,9999)。ToString();位图位图=CreateAuthCode(代码);位图。保存(流,系统绘图。成像。imageformat。gif);}私有字符串GenerateCheckCodes(int iCount){ int number;字符串检查代码=字符串。空的;int iSeed=DateTime .现在。毫秒;系统。随机=新随机(iSeed);for(int I=0;i iCounti ) { number=random .接下来(10);checkCode=数字. ToString();}会话['校验码']=校验码;返回checkCode}私有位图CreateAuthCode(字符串字符串){字体fn=新字体('宋体', 12);画笔前景=画笔。黑色;画笔bgcolor=画笔。白色;点数pf=新的PointF(5,5);位图位图=新位图(100,25);矩形rec=新矩形(0,0,100,25);图形gh=图形FromImage(位图);啊FillRectangle(bgcolor,rec);啊。拉绳(str、fn、forecolor、pf);返回位图;} private void CreateCheckCodeImage(字符串校验码){ if(校验码==null | |校验码.Trim()==字符串.空)返回;int iWordWidth=15 int iimagewwidth=check code .长度* iWordWidth位图图像=新位图(图像宽度,20);图形g=图形FromImage(图像);尝试{ //生成随机生成器Random Random=new Random();//清空图片背景色透明(颜色。白色);//画图片的背景噪音点for(int I=0;i 20i ) { int x1=random .下一张(图片。宽度);int x2=随机。下一张(图片。宽度);int y1=随机。下一张(图片。身高);int y2=随机。下一张(图片。身高);画线(新钢笔(颜色。银)、x1、y1、x2、y2);} //画图片的背景噪音线for(int I=0;I 2;I){ int x1=0;int x2=图像。宽度;int y1=随机。下一张(图片。身高);int y2=随机。下一张(图片。身高);if (i==0) { g.DrawLine(新钢笔(颜色。灰色,2)、x1、y1、x2、y2);} } for(int I=0;我检查代码。长度;I){ 0字符串代码=检查代码[i].ToString();int xle ft=iwordWidth *(I);Random=new Random(Xleft);int iSeed=DateTime .现在。毫秒;int iValue=随机。下一个(iSeed)% 4;if(iValue==0){ Font Font=new Font(' Arial ',13,(FontStyle .粗体|系统绘图。字体样式。斜体));矩形rc=新矩形(xLeft,0,iWordWidth,image .身高);线性渐变画笔=新的线性渐变画笔(钢筋混凝土,颜色.蓝色,彩色。红色,1.5f,真);g。拉绳(代码、字体、画笔、xLeft、2);}否则如果(iValue==1){ Font Font Font=新系统.绘图。字体('楷体13岁(FontStyle .粗体));矩形rc=新矩形(xLeft,0,iWordWidth,image .身高);线性渐变画笔=新的线性渐变画笔(钢筋混凝土,颜色.蓝色,彩色暗红色,1.3f,真);g。拉绳(代码、字体、画笔、xLeft、2);}否则如果(iValue==2){ Font Font Font=新系统.绘图。字体('宋体,13,(系统绘图。字体样式。粗体));矩形rc=新矩形(xLeft,0,iWordWidth,image .身高);线性渐变画笔=新的线性渐变画笔(钢筋混凝土,颜色.绿色,彩色。蓝色,1.2f,真);g。拉绳(代码、字体、画笔、xLeft、2);}否则if(iValue==3){ Font Font Font=新系统.绘图。字体('黑体,13,(系统。绘图。字体样式。粗体|系统绘图。字体样式。粗体));矩形rc=新矩形(xLeft,0,iWordWidth,image .身高);线性渐变画笔=新的线性渐变画笔(钢筋混凝土,颜色.蓝色,彩色。绿色,1.8f,真);g。拉绳(代码、字体、画笔、xLeft、2);} } //////画图片的前景噪音点//for(int I=0;i8;i ) //{ //int x=random .下一张(图片。宽度);//int y=random .下一张(图片。身高);//图像。设置像素(x,y,颜色FromArgb(随机. next()));//} //画图片的边框线画矩形(新钢笔(颜色。银色),0,0,图像。宽度- 1,图像。身高-1);系统。内存流=新系统IO。内存流();图像。保存(毫秒,系统绘图。成像。imageformat。gif);回应ClearContent();回应二进制写入(ms . to array());}最后{ g . Dispose();图像dispose();} }

更多资讯
游戏推荐
更多+