用C#实现网站验证码的实验报告.docx
《用C#实现网站验证码的实验报告.docx》由会员分享,可在线阅读,更多相关《用C#实现网站验证码的实验报告.docx(10页珍藏版)》请在冰豆网上搜索。
![用C#实现网站验证码的实验报告.docx](https://file1.bdocx.com/fileroot1/2022-11/15/cf275bd7-63c2-4122-9340-c63623e3d640/cf275bd7-63c2-4122-9340-c63623e3d6401.gif)
用C#实现网站验证码的实验报告
目录
1.软件设计要求和规范2
2.软件制作过程(含增加的功能)2
3.收获与体会12
4.参考文献12
1.软件设计要求和规范
为了防止网站被非法登陆,网站一般通过验证码的方式,防止黑客用软件非法登陆。
验证码一般采用干扰后的图像显示,人可以识别,但机器识别有困难。
本案例用VisualC#.NET开发一个网站的验证码生成软件,并在网页上测试该软件的有效性。
2.软件制作过程(含增加的功能)
1.打开VisualC#.NET2010,通过“文件”/“新建”/“网站”,打开“新建网站”对话框,如图1所示。
选择“ASP.NET网站”,在“Web位置”选择保存网站的目录,单击确定按钮。
图1新建网站
2.建立ValidateImage.ashx文件
右击解决方案名称,在弹出的菜单中选择“新建项目”,打开“添加新项”对话框,选择“一般处理程序”,文件名称改为“ValidateImage.ashx”,单击“添加”按钮。
如图2所示。
图2添加.ashx程序
打开ValidateImage.ashx文件,并按照下列代码输入程序。
<%@WebHandlerLanguage="C#"Class="ValidateImage"%>
usingSystem;
usingSystem.Web;
usingSystem.IO;
usingSystem.Drawing;
publicclassValidateImage:
IHttpHandler,
System.Web.SessionState.IRequiresSessionState
{
publicvoidProcessRequest(HttpContextcontext){
context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
stringvalid="";//定义随机数字
//生成包含验证码的图片
MemoryStreamms=Create(outvalid);
//存储在session中的验证码,用于验证
context.Session["validateImage"]=valid;
//置空输出流
context.Response.ClearContent();
//输出流格式
context.Response.ContentType="image/png";
//输出
context.Response.BinaryWrite(ms.ToArray());
context.Response.End();
}
publicboolIsReusable{
get{
returnfalse;
}
}
//用来产生2位数的随机分配的方法
privatestringRndNum(intVcodeNum)
{
stringVchar="1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,p,q"+",r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,T,U,V,W,X,Y,Z";
//拆分数组
string[]VcArray=Vchar.Split(newChar[]{','});
////收集随机数
stringVNum="";
//记录最后的随机数,尽量避免同一随机数
inttemp=-1;
Randomrand=newRandom();
//通过一个简单的算法,以确保不同随机编号
for(inti=1;i{
if(temp!
=-1)
{
rand=newRandom(i*temp*unchecked((int)DateTime.Now.Ticks));
}
intt=rand.Next(55);
if(temp!
=-1&&temp==t)
{
returnRndNum(VcodeNum);
}
temp=t;
//随机数中位数加一
VNum+=VcArray[t];
}
returnVNum;
}
//生成随机数,并将其写入图像文件
publicMemoryStreamCreate(outstringVNum)
{
VNum=RndNum(3);
Bitmaplmg=null;
Graphicsg=null;
MemoryStreamms=null;
System.Randomrandom=newRandom();
Color[]c={Color.Black,Color.Red,Color.DarkBlue,Color.Green,
Color.Brown,Color.DarkCyan,Color.Purple};
String[]fonts={"Verdana","MicrosoftSansSerif","ComicSannsMS","Arial","宋体"};
lmg=newBitmap((int)VNum.Length*18,32);
g=Graphics.FromImage(lmg);
g.Clear(Color.White);
//在背景的随机位置画图
for(inti=0;i<100;i++)
{
intx=random.Next(lmg.Width);
inty=random.Next(lmg.Height);
g.DrawRectangle(newPen(Color.LightGray,0),x,y,1,1);
}
//在g中映射验证码
for(inti=0;i{
intcindex=random.Next(6);
intfindex=random.Next(5);
//格式
Fontf=newSystem.Drawing.Font(fonts[findex],15,System.Drawing.FontStyle.Regular);
Brushb=newSystem.Drawing.SolidBrush(c[cindex]);
intii=4;
if((i+1)%2==0)//控制不同验证码字符在垂直方向上的位置
{
ii=2;
}
g.DrawString(VNum.Substring(i,1),f,b,3+(i*12),ii);
}
ms=newMemoryStream();
lmg.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
g.Dispose();
lmg.Dispose();
returnms;
}
}
3.建立测试验证码的链接。
在解决方案上右击,选择“添加新项”,弹出对话框如图3所示。
选择“Web窗体”模板,名称为“loginform.aspx”,单击“添加”按钮。
在loginform.aspx窗体中,按照图4所示,放入多个控件。
控件说明如下:
1)Label控件,名称Label1,text属性为“用户名”;
2)TextBox控件,名称TextBox1;
3)Label控件,名称Label2,text属性为“密码”;
4)TextBox控件,名称为TextBox2;TextMode为“password”;
5)Label控件,名称为Label3,text属性为“验证码”;
6)TextBox控件,名称为TextBox3;
7)Image控件,名称为Image1,ImageUrl属性设置为ValidateImage.ashx;
8)HyperLink控件,名称为HyperLink1,Text属性为“看不清,换一张”,NavigateUrl设置为loginform.aspx;
9)Button控件,名称为Button1,Text属性为“提交”。
图3增加loginform窗体
4.双击loginform.aspx中的提交按钮,进入按钮的响应事件处理程序。
加入下列代码:
protectedvoidButton1_Click(objectsender,EventArgse)
{
if(TextBox3.Text==Session["validateImage"].ToString())
{
Response.Write("祝贺你,验证成功!
"+TextBox3.Text);
Response.Write("用户名为:
"+TextBox1.Text);
}
else
{
Response.Write("对不起,验证失败!
"+TextBox3.Text+"--->"+Session["validateImage"]);
}
}
5.在default.aspx主页上添加loginform的链接。
在主页上加入HyperLink控件,其NavigateUrl置为loignform.aspx。
如图5所示。
图5.主页中增加链接,用于登陆
附:
增加的功能:
(1)用表格定位各个控件,同时改变各控件的背景颜色,使界面更美化如图6,7所示
图6先插入表格定位使界面更加美观
图7使界面更美观
(2)验证码显示位数的增加,如图8所示
VNum=RndNum(3);VNum=RndNum(7);
(3)改变验证码背景颜色,增加验证码后不规则图形,使验证码识别难度加大,如图9所示
g.Clear(Color.White);g.Clear(Color.Gray);
intx=random.Next(Img.Width);
inty=random.Next(Img.Height);
g.DrawRectangle(newPen(Color.LightGray,0),x,1,y,1);
intx1=random.Next(Img.Width);
intx2=random.Next(Img.Width);
inty1=random.Next(Img.Height);
inty2=random.Next(Img.Height);
g.DrawRectangle(newPen(Color.LightGray,0),x1,x2,y1,y2);
图9增加验证码的识别难度
3.收获与体会
通过近两周的实训课程设计,我意识到自己还存在许多不足,在这次课程设计完成过程中我发现了自己的薄弱环节,并且在逐步完成任务的同时,我也渐渐解决了这些问题。
C#是一门功能非常强大的完全面向对象的语言。
借助这种语言我们不仅能完成控制台的程序,还可以结合各种控件,制作成一个有界面的真正意义上的程序。
在了解C#这门语言一段时间之后,我对C#产生了浓厚的兴趣,这更激发了我的学习热情。
学习C#知识和操作的过程困难重重,产生困难的原因是因为以前对C#的认识不够,只是表面的一些东西,还有就是对软件的不熟悉。
为了克服困难我在网上查找相关的内容,查找的相关的书籍,在同学的