ASP.NET验证码(3种)

日常生活中我们在使用网站时都会遇到验证码,大家有没有想过为什么要使用验证码?

其实验证码的作用就是防止恶意破解密码、刷票、论坛灌水、刷页。有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登录尝试。今天就跟大家分享ASP.NET的三种验证码。

1.GSC_WebControlLibrary 这是在网上找到的一个控件,非常好用。但是效果不是特别好(见下图。
)虽然容易使用,所有的属性都可以像控件一样设置,但是可用性不太高。用户不能自定义,而且看起来这个验证码效果不太好。

效果:

2.用一个页面生成图片,另一个页面调用,验证码存入cookie,调用时取cookie对比验证.这个用户就可以按自己的喜好更改效果和验证码的长度了。

效果如图:

CheckCode.aspx代码如下:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;

public partial class Tools_CheckCode : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
    this.CreateCheckCodeImage(GenerateCheckCode());

  }

  private string GenerateCheckCode()
  {
    int number;
    char code;
    string checkCode = String.Empty;

    System.Random random = new Random();

    for (int i = 0; i < 5; i++)
    {
      number = random.Next();

      if (number % 2 == 0)
        code = (char)('0' + (char)(number % 10));
      else
        code = (char)('A' + (char)(number % 26));

      checkCode += code.ToString();
    }

    Response.Cookies.Add(new HttpCookie("CheckCode", checkCode));

    return checkCode;
  }

  private void CreateCheckCodeImage(string checkCode)
  {
    if (checkCode == null || checkCode.Trim() == String.Empty)
      return;

    System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length * 12.5)), 22);
    Graphics g = Graphics.FromImage(image);

    try
    {
      //生成随机生成器
      Random random = new Random();

      //清空图片背景色
      g.Clear(Color.White);

      //画图片的背景噪音线
      for (int i = 0; i < 25; i++)
      {
        int x1 = random.Next(image.Width);
        int x2 = random.Next(image.Width);
        int y1 = random.Next(image.Height);
        int y2 = random.Next(image.Height);

        g.DrawLine(new Pen(Color.GreenYellow), x1, y1, x2, y2);
      }

      Font font = new System.Drawing.Font("Verdana", 12, (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic));
      System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true);
      g.DrawString(checkCode, font, brush, 2, 2);

      //画图片的前景噪音点
      for (int i = 0; i < 80; i++)
      {
        int x = random.Next(image.Width);
        int y = random.Next(image.Height);

        image.SetPixel(x, y, Color.FromArgb(random.Next()));
      }

      //画图片的边框线
      g.DrawRectangle(new Pen(Color.Red), 0, 0, image.Width - 1, image.Height - 1);

      System.IO.MemoryStream ms = new System.IO.MemoryStream();
      image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
      Response.ClearContent();
      Response.ContentType = "image/Gif";
      Response.BinaryWrite(ms.ToArray());
    }
    finally
    {
      g.Dispose();
      image.Dispose();
    }
  }

}

然后在需要使用的页面引用:
UseCheckCode.aspx

<img src="Tools/CheckCode.aspx" alt="验证码" style="width: 60px; height: 24px" />

3.用web handler生成图片。这个其实和前面的意思大致差不多,调用方法也基本和2一样,不同的是,它的验证码是存入Session的。供学习参考。

效果图如下:

ValidateImageHandler.ashx

%@ WebHandler Language="C#" Class="ValidateImageHandler" %>

using System;
using System.Web;
using System.Web.SessionState;
using System.Drawing;
using System.Drawing.Imaging;
using System.Text;

/// <summary>
/// ValidateImageHandler 生成网站验证码功能
/// </summary>
public class ValidateImageHandler : IHttpHandler, IRequiresSessionState
{
  int intLength = 5;        //长度
  string strIdentify = "Identify"; //随机字串存储键值,以便存储到Session中
  public ValidateImageHandler()
  {
  }

  /// <summary>
  /// 生成验证图片核心代码
  /// </summary>
  /// <param name="hc"></param>
  public void ProcessRequest(HttpContext hc)
  {
    //设置输出流图片格式
    hc.Response.ContentType = "image/gif";

    Bitmap b = new Bitmap(200, 60);
    Graphics g = Graphics.FromImage(b);
    g.FillRectangle(new SolidBrush(Color.YellowGreen), 0, 0, 200, 60);
    Font font = new Font(FontFamily.GenericSerif, 48, FontStyle.Bold, GraphicsUnit.Pixel);
    Random r = new Random();

    //合法随机显示字符列表
    string strLetters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
    StringBuilder s = new StringBuilder();

    //将随机生成的字符串绘制到图片上
    for (int i = 0; i < intLength; i++)
    {
      s.Append(strLetters.Substring(r.Next(0, strLetters.Length - 1), 1));
      g.DrawString(s[s.Length - 1].ToString(), font, new SolidBrush(Color.Blue), i * 38, r.Next(0, 15));
    }

    //生成干扰线条
    Pen pen = new Pen(new SolidBrush(Color.Blue), 2);
    for (int i = 0; i < 10; i++)
    {
      g.DrawLine(pen, new Point(r.Next(0, 199), r.Next(0, 59)), new Point(r.Next(0, 199), r.Next(0, 59)));
    }
    b.Save(hc.Response.OutputStream, ImageFormat.Gif);
    hc.Session[strIdentify] = s.ToString(); //先保存在Session中,验证与用户输入是否一致
    hc.Response.End();

  }

  /// <summary>
  /// 表示此类实例是否可以被多个请求共用(重用可以提高性能)
  /// </summary>
  public bool IsReusable
  {
    get
    {
      return true;
    }
  }
}

以上就是ASP.NET3种验证码,各有各的优缺点,希望大家可以熟练实现不同验证码的功能。

(0)

相关推荐

  • MVC使用极验验证制作登录验证码学习笔记7

    在之前的项目中,如果有需要使用验证码,基本都是自己用GDI+画图出来,简单好用,但是却也存在了一些小问题,首先若较少干扰线,则安全性不是很高,验证码容易被机器识别,若多画太多干扰线条,机器人识别率下降的同时,人眼的识别率也同步下降(震惊哭).更为重要的是,GDI+绘制的验证码一般来说也不会很美观,如果做一个炫酷的登陆界面却配了这样一个验证码,画风诡异,丑到极致. 再后来浏览网页的过程中,发现很多很多网站项目中都使用了一种叫极验验证的验证码,采用移动滑块的方式进行验证,方便美观.而一番搜索之后了解

  • 深入学习.net验证码生成及使用方法

    小课堂:验证码的作用: 几年前,大部分网站.论坛之类的是没有验证码的,因为对于一般用户来说验证码只是增加了用户的操作,降低了用户的体验.但是后来各种灌水机器人.投票机器人.恶意注册机器人层出不穷,大大增加了网站的负担同时也给网站数据库带来了大量的垃圾数据.为了防止各种机器人程序的破坏,于是程序员想出了只有人眼能够识别的,程序不容易识别的验证码! 验证码是一个图片,将字母.数字甚至汉字作为图片的内容,这样一张图片中的内容用人眼很容易识别,而程序将无法识别.在进行数据库操作之前(比如登录验证.投票.

  • asp.net登录验证码实现方法

    前端添加的标签和方法: 验证码: 复制代码 代码如下: <input id="txtVerifyCode" type="text" maxlength="5" style="line-height: 30px;  height: 30px; width: 80px;border:solid 1px #d4d4d4;" class="input"/>&nbsp<img src=&qu

  • asp.net生成字母和数字混合图形验证码

    验证码技术是网站开发过程中比较重要的技术,可以防止非法人员利用注册机或者登陆工具来攻击我们的网站.下面是效果图: 具体实现方法如下: 1.主要思路是:引用Using System.Drawing命名空间,利用Graphics的FromImage方法创建一个画布,同时设置画布的宽和高,然后通过Graphics类 的DrawString方法随机生成的字符串绘制到画布中,绘制验证码的同时,在画布中利用SetPixel方法绘制一些色点,从而防止非法人员利用机器 人来进行登陆.当我们绘制验证码完毕后,在需

  • asp.net简单生成验证码的方法

    本文实例讲述了asp.net简单生成验证码的方法.分享给大家供大家参考,具体如下: 1.新建一个一般处理程序 namespace WebApplication1 { /// <summary> /// $codebehindclassname$ 的摘要说明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfil

  • .net生成验证码

    本文为大家分享了.net生成验证码所有代码,大家可以动手操作一下,会有意想不到的收获. 先给大家看看效果图: 页面代码: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>验证码</title> <script type="text/javascript"> //换一张 function ch

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

    一般验证码的生成方法都是相同的,主要的步骤都有两步 第一步:随机出一系统验证码的数字或字母,顺便把随机生成的数字或字母写入Cookies 或者 Session. 第二步:用第一步随机出来的数字或字母来合成图片. 可以看出来验证码的复杂度主要是第二步来完成,你可以根据自己所要的复杂度来设定. 我们一起来看看:  第一步:随机生成数字或字母的方法 /// <summary> /// 生成验证码的随机数 /// </summary> /// <returns>返回五位随机数&

  • 12306动态验证码启发之ASP.NET实现动态GIF验证码(附源码)

    12306网站推出"彩色动态验证码机制",新版验证码不但经常出现字符叠压,还不停抖动,不少人大呼"看不清",称"那个验证码,是毕加索的抽象画么!"铁总客服则表示:为了能正常购票只能这样.而多家抢票软件接近"报废",引发不少网友不满的吐槽称"太抽象太艺术了". 以前做项目有时候也会用到验证码,但基本都是静态的,这次也想凑凑12306的热闹.闲言少续,切入正题,先上代码. 实现方法: public void S

  • ASP.NET验证码实现(附源码)

    首先看下效果实现(由于gif屏幕录制软件是即时找的,有些失祯) 代码主要就是绘制验证码类的实现 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Drawing; using System.IO; namespace SecurityCodePic { public class DrawingSecurityCode { /// <summary>

  • asp.net验证码的简单制作

    实际上关于asp.net验证码制作的文章已经很多很多了,但是今天还是要和大家继续分享,亲,可以综合几篇实例,编写出适用于自己网站的ASP.NET验证码,大概也就两大部分: 先建立一个asp.net窗体ValidateCode.aspx:不写任何东西.直接在后台ValidateCode.aspx.cs中写如下代码: protected void Page_Load(object sender, EventArgs e) { string validateCode = CreateValidateC

随机推荐