如何用ASP.NET实现验证码

我们要创建一个图片服务页面,专门用于提供包含验证码文本的图片,为此我们建立一个 checkimage.aspx 的页面。

其HTML代码很简单,只有一行,不输出任何内容。在其Page_Load方法中就有创建验证码图片的过程。

// 创建一个包含随机内容的验证码文本

System.Random rand = new Random();

int len = rand.Next(4 , 6 );

char[] chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();

System.Text.StringBuilder myStr = new System.Text.StringBuilder();

for( int iCount = 0 ; iCount < len ; iCount ++ ) { myStr.Append( chars[ rand.Next( chars.Length )]); }

string text = myStr.ToString();

// 保存验证码到 session 中以便其他模块使用:

 this.Session["checkcode"] = text ;

 Size ImageSize = Size.Empty ;

Font myFont = new Font("MS Sans Serif" , 20 );

// 计算验证码图片大小

 using( Bitmap bmp = new Bitmap( 10 , 10 )) {

    using( Graphics g = Graphics.FromImage( bmp )) { SizeF size = g.MeasureString( text , myFont , 10000 );

    ImageSize.Width = ( int ) size.Width + 8 ;

    ImageSize.Height = ( int ) size.Height + 8 ; }

}

// 创建验证码图片

using( Bitmap bmp = new Bitmap( ImageSize.Width , ImageSize.Height )) {

    // 绘制验证码文本

    using( Graphics g = Graphics.FromImage( bmp )) {

         g.Clear( Color.White );

         using( StringFormat f = new StringFormat()) {

            f.Alignment = StringAlignment.Near ;

            f.LineAlignment = StringAlignment.Center ;

            f.FormatFlags = StringFormatFlags.NoWrap ;

            g.DrawString( text , myFont , Brushes.Black , new RectangleF( 0 , 0 , ImageSize.Width , ImageSize.Height ), f );

        }

}

// 制造噪声 杂点面积占图片面积的 30%

 int num = ImageSize.Width * ImageSize.Height * 30 / 100 ;

 for( int iCount = 0 ; iCount < num ; iCount ++ ) {

     // 在随机的位置使用随机的颜色设置图片的像素

    int x = rand.Next( ImageSize.Width );

    int y = rand.Next( ImageSize.Height );

    int r = rand.Next( 255 );

    int g = rand.Next( 255 );

     int b = rand.Next( 255 );

    Color c = Color.FromArgb( r , g , b );

     bmp.SetPixel( x , y , c );

}

// 输出图片

System.IO.MemoryStream ms = new System.IO.MemoryStream();

bmp.Save( ms , System.Drawing.Imaging.ImageFormat.Png );

this.Response.ContentType = "image/png";

ms.WriteTo( this.Response.OutputStream );

ms.Close(); }

//using

myFont.Dispose();

首先我们使用.NET框架中随机数生成器 Random类型来生成一个不定长的包含随机数字和英文字符的文本,这就是验证码原始文本,我们将其保存在session中供以后使用。然后我们创建一个临时图片,并据此创建一个临时的图象绘制对象,然后调用Graphics的MeasureString函数获得这个字符串的显示大小。据此我们就可以计算出验证码图片的大小。然后我们创建一个位图对象,在此基础上创建一个图形绘制对象,然后调用图形绘制对象的DrawString函数将验证码文本绘制在这个位图上。绘制验证码后我们在图片上随机的制造杂点来混淆图片内容。这些杂点的面积占图片面积的30%,而且其位置和颜色都是随机的。这些杂点能严重的干扰程序辨认验证码文本。但人脑在辨认文本时能比较轻松的排除这些干扰。图片生成后页面就使用PNG格式将图片文档发送到客户端。 checkimage.aspx还提供了一个静态函数来检测验证码。

/// 检查指定的文本是否匹配验证码  /// 要判断的文本 /// 是否匹配

public static bool CheckCode( string text ) {

    string txt = System.Web.HttpContext.Current.Session["checkcode"] as string ;

    return text == txt ;

}

 代码很简单。就是看看参数传进的文本是否等于 session 中保存的验证码文本。其他的页面程序调用这个函数就可以判断验证码的正确性。

 login.aspx 验证码图片服务页面完成后,我们就可以利用这个页面来实现验证码技术。我们建立一个模拟系统登录的页面。上面放置输入用户名,密码和验证码的三个文本输入框。其中验证码输入框后面放置一个图片,图片就来源于checkimage.aspx页面。用户输入三个信息后点击确定按钮进行登录。则运行该按钮的服务器段代码。

private void cmdOK_Click(object sender, System.EventArgs e) {

    string UserName = this.txtUserName.Text ;

    string Password = this.txtPassword.Text ;

    string CheckCode = this.txtCheckCode.Text ;

    if( UserName == "张三" && Password == "abc" && checkimage.CheckCode( CheckCode ) ) {

        this.lblResult.Text = "登录成功";

        this.RegisterStartupScript("a" , " ");

    } else {

         this.lblResult.Text = "用户登录信息错误,请重新输入";

    }

}

在该代码中,程序获得用户输入的用户名,密码和验证码,然后判断用户名密码是否正确,还调用checkimage的静态函数CheckCode来判断验证码是否正确。只有这三个信息都正确则登录成功,否则登录失败。在少数情况下,程序生成的验证码图片难以辨认,则需要重新提供新的验证码图片,此时我们在登录页面中可以双击这个图片来更新验证码图片。

显示验证码图片的HTML代码片断为:

title='看不清楚,双击图片换一张。'

οndblclick="this.src = 'checkimage.aspx?flag=' + Math.random() " border="1">

可以看到 ondblclick 事件处理中更新了图片来源,这里使用了一个毫无意义的flag页面参数,这是保证浏览器不会使用本地缓存的验证码图片而是下载最新的验证码图片。用户双击图片后,浏览器重新调用checkimage.aspx页面,于是服务器端的验证码文本用了新的,而图片内容也随之更新。

由于每次尝试登录或更换验证码图片时,正确的验证码都是随机的发生改变,毫无规律,这样就很大的增强了登录页面的安全性。但这样做会让用户登录时需要辨认和输入验证码,这会降低应用程序的可用性。因此是否使用验证码技术是需要多方面权衡的。

查看完整的教程请点:http://www.97xxoo.org/article/4/2008/20081022090.shtml

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C# ASP.NET 中生成验证码可以通过以下步骤实现: 1. 在 ASPX 页面中添加一个 Image 控件,用于显示验证码图片: ```html <asp:Image ID="imgCaptcha" runat="server" /> ``` 2. 在 ASPX 页面中添加一个 Button 控件,用于刷新验证码: ```html <asp:Button ID="btnRefresh" runat="server" Text="刷新" OnClick="btnRefresh_Click" /> ``` 3. 在 ASPX 页面中添加一个 TextBox 控件,用于用户输入验证码: ```html <asp:TextBox ID="txtCaptcha" runat="server"></asp:TextBox> ``` 4. 在后台代码中生成验证码图片和验证码字符串: ```csharp protected void GenerateCaptcha() { // 生成随机验证码字符串 string captcha = GenerateRandomCode(); // 将验证码字符串存储到 Session 中,用于验证用户输入 Session["Captcha"] = captcha; // 生成验证码图片 Bitmap image = new Bitmap(200, 50); Graphics graphics = Graphics.FromImage(image); Font font = new Font("Arial", 20, FontStyle.Bold); Rectangle rect = new Rectangle(0, 0, image.Width, image.Height); Brush brush = new SolidBrush(Color.FromArgb(255, 0, 0, 0)); graphics.FillRectangle(brush, rect); brush = new SolidBrush(Color.FromArgb(255, 255, 255, 255)); graphics.DrawString(captcha, font, brush, 10, 10); MemoryStream stream = new MemoryStream(); image.Save(stream, ImageFormat.Png); // 将验证码图片显示在 Image 控件中 imgCaptcha.ImageUrl = "data:image/png;base64," + Convert.ToBase64String(stream.ToArray()); } ``` 5. 在后台代码中处理刷新按钮的点击事件,重新生成验证码: ```csharp protected void btnRefresh_Click(object sender, EventArgs e) { GenerateCaptcha(); } ``` 6. 在后台代码中处理用户提交表单的事件,比较用户输入的验证码和 Session 中存储的验证码是否一致: ```csharp protected void btnSubmit_Click(object sender, EventArgs e) { string captcha = Session["Captcha"] as string; if (txtCaptcha.Text == captcha) { // 验证码正确,继续处理表单提交 } else { // 验证码错误,提示用户重新输入 } } ``` 注意:为了增加验证码的安全性,应该在生成随机验证码字符串时使用随机数生成器,并且在生成验证码图片时使用随机字体和随机颜色,以防止恶意程序破解验证码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值