`
hududanyzd
  • 浏览: 777420 次
文章分类
社区版块
存档分类
最新评论

非常经典的asp.net验证码制作实例代码详解

 
阅读更多

一、ASP.Net的验证码的作用
对于一个预防攻击的web表单来讲,验证码通常是一个常见的措施。因为如果对于一些public区域的页面内容来讲,譬如一个登录表单,如果没有必要的安全措施,很可能遭到模拟登录的暴力破解攻击,要么轻易获得特定账户的登录信息,要么给服务器增加了大量的负荷,影响正常的服务。解决的办法,一般就是在登录前给出一个随机的信息(验证码),显示在页面上,让用户填写,以确保用户是通过web页面来进行正常的登入,对于非法的非web途径登录者会看不到这个验证码从而拒绝其登录。虽然这样,往往很多攻击者会截获登录web页,从而也搜索出验证码,这样,验证保护措施也失去意义,一般情况下,我们可以通过将验证信息作为图像信息显示在web上,这样就既可以不阻碍合法用户登录,又使非法攻击者无法通过html搜索获得验证信息。这大抵上就是验证码的用途和意义了。
二、ASP.Net的验证码实现

一般传统的验证码图像一般采用一些CGI、ISAPI程序加上一些加密代码来动态生成图像,ASP大多采用COM组件实现,相当辛苦。

ASP.Net中欲实现动态验证码却相当容易,实例解说

重点列出viewImg.aspx,前台没有任何代码,在后台中需要添加以下代码:
//导入所需要的包
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
//然后在Load事件中添加以下代码
protected void Page_Load(object sender, EventArgs e)
{
string chkCode = string.Empty;

//颜色列表,用于验证码、噪线、噪点
Color[] color ={ Color.Black, Color.Red, Color.Blue, Color.Green, Color.Orange,

Color.Brown, Color.DarkBlue };

//字体列表,用于验证码
string[] font ={ "Times New Roman", "MS Mincho", "Book Antiqua", "Gungsuh",

"PMingLiU", "Impact" };

//验证码的字符集,去掉了一些容易混淆的字符
char[] character ={ '2', '3', '4', '5', '6', '8', '9', 'A', 'B', 'C', 'D', 'E',

'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'W', 'X', 'Y' };

Random rnd = new Random();

//生成验证码字符串
for (int i = 0; i < 4; i++)
{
chkCode += character[rnd.Next(character.Length)];
}

//保存验证码的Cookie
HttpCookie anycookie = new HttpCookie("validateCookie");

anycookie.Values.Add("ChkCode", chkCode);

HttpContext.Current.Response.Cookies["validateCookie"].Values["ChkCode"] =

chkCode;

Bitmap bmp = new Bitmap(150, 30);

Graphics g = Graphics.FromImage(bmp);

g.Clear(Color.White);

//画噪线
for (int i = 0; i < 5; i++)
{
int x1 = rnd.Next(150);
int y1 = rnd.Next(30);
int x2 = rnd.Next(150);
int y2 = rnd.Next(30);
Color clr = color[rnd.Next(color.Length)];
g.DrawLine(new Pen(clr), x1, y1, x2, y2);
}

//画验证码字符串
for (int i = 0; i < chkCode.Length; i++)
{
string fnt = font[rnd.Next(font.Length)];
Font ft = new Font(fnt, 16);
Color clr = color[rnd.Next(color.Length)];
g.DrawString(chkCode[i].ToString(), ft, new SolidBrush(clr), (float)i * 20 +

20, (float)6);
}

//画噪点
for (int i = 0; i < 100; i++)
{
int x = rnd.Next(bmp.Width);
int y = rnd.Next(bmp.Height);
Color clr = color[rnd.Next(color.Length)];
bmp.SetPixel(x, y, clr);
}
//清除该页输出缓存,设置该页无缓存
Response.Buffer = true;

Response.ExpiresAbsolute = System.DateTime.Now.AddMilliseconds(0);

Response.Expires = 0;

Response.CacheControl = "no-cache";

Response.AppendHeader("Pragma", "No-Cache");

//将验证码图片写入内存流,并将其以"image/Png" 格式输出
MemoryStream ms = new MemoryStream();

try
{
bmp.Save(ms, ImageFormat.Png);
Response.ClearContent();
Response.ContentType = "image/Png";
Response.BinaryWrite(ms.ToArray());
}
finally
{
//显式释放资源
bmp.Dispose();
g.Dispose();
}
}

添加完成后,该页面就可以生成一个彩色验证码
在需要验证的页面只需要在代码中加入<img src="viewImg.aspx" />即可。
在验证时可用Request.Cookies["validateCookie"].Values["ChkCode"].ToString();获取该值进行验证

protected void Button1_Click(object sender, EventArgs e)
{
string text=this.TextBox1.Text.ToString();//获得用户输入的验证码
string chkcode=Request.Cookies["validateCookie"].Values["ChkCode"].ToString();//获得系统生成的验证码
if (!string.IsNullOrEmpty(text) && !string.IsNullOrEmpty(chkcode))
{
if (!chkcode.Equals(chkcode.ToUpper()))//如果系统生成的不为大写则转换成大写形式
chkcode.ToUpper();
if (text.ToUpper().Trim().Equals(chkcode.Trim())) //将输入的验证码转换成大写并与系统生成的比较
this.Label1.Text = "this is right";
else
{
this.Label1.Text = "this is not right";
}
}
else if (string.IsNullOrEmpty(text))
{
this.Label1.Text = "Please input checkcode!!";
}

}

分享到:
评论

相关推荐

    ASP.NET生成图形验证码的方法详解

    本文实例讲述了ASP.NET生成图形验证码的方法。分享给大家供大家参考,具体如下: 通常生成一个图形验证码主要 有3个步骤: (1)随机产生一个长度为N的随机字符串,N的值可由开发可由开发人员自行设置。该字符串可以...

    ASP.NET3.5典型模块开发源代码

    19.3 用ASP.NET 3.5制作PDF格式化工具 242 19.3.1 创建文本型PDF文档 243 19.3.2 在PDF中添加导航链接 244 19.3.3 在PDF中添加页眉页脚 245 19.3.4 在PDF中插入图片 247 19.4 小结 248 第20章 留言板...

    asp.net知识库

    ASP.NET 2.0 正式版中无刷新页面的开发(示例代码的补充) ASP.NET2.0中themes、Skins轻松实现网站换肤! ASP.NET 2.0 中的代码隐藏和编译 ASP.NET 2.0 Language Swithcer and Theme Swicher 多语言转换和多样式主题...

    ASP.NET Night Words

    第1章 asp.net介绍 2 1.1 xhtml语言 2 1.2 静态网页 3 1.3 动态网页 3 1.4 iis的安装和配置 3 1.5 asp.net开发的预备知识 4 1.5.1 asp.net简介 4 1.5.2 在iis上配置asp.net 4 1.5.3 visual studio版本与 ...

    亮剑.NET深入体验与实战精要2

    3.1.3 ASP.NET生命周期详解 118 3.2 页面状态管理 120 3.2.1 Cookie 121 3.2.2 HtmlInputHidden隐藏域 123 3.2.3 ViewState 123 3.2.4 查询字符串Request 124 3.2.5 Aplication对象 125 3.2.6 Session对象 125 ...

    亮剑.NET深入体验与实战精要3

    3.1.3 ASP.NET生命周期详解 118 3.2 页面状态管理 120 3.2.1 Cookie 121 3.2.2 HtmlInputHidden隐藏域 123 3.2.3 ViewState 123 3.2.4 查询字符串Request 124 3.2.5 Aplication对象 125 3.2.6 Session对象 125 ...

    史上最全韩顺平传智播客PHP就业班视频,10月份全集

    9-23 5.session④-验证码防恶意攻击 9-23 6.session⑤-session配置 session的gc机制 自定义session处理器 9-24 0.回顾 9-24 1.回顾2 9-24 2.php文件编程①-文件操作原理 如何获取文件信息 如何读文件 9-24 3.php文件...

    iuhyiuhkjh908u0980

    ant配置文件实例详解 build.xml 代码 xml version="1.0" encoding="UTF-8"?&gt; &lt;!-- name:对应工程的名字;default:需要的缺省任务(运行"ant"不指明任务时执行的任务) --&gt; by duzn 2007-04-02 回复 (0) Antenna与j2me...

    韩顺平sevlet,jsp视频教程知识点.txt

    视频描述: 1 如何在servlet中显示图片 2 分页技术详解 3 用户登录系统功能改进 韩顺平 j2ee视频实战教程servlet第5讲(上集).wmv 视频描述: (一) Cookie的讲解和使用 (二) Cookie和Session的比较 (三) 网站框架的...

Global site tag (gtag.js) - Google Analytics