MyPersistence

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

一、软件中使用验证码的作用

  现在软件中的很多地方有用到验证码,比如注册账号、登录的时候等等。验证码的使用是为了防止“爆破”既暴力破解,那什么是暴力破解呢,暴力破解就是利用程序,按照一定的规律往表单中输入数据,逐个测试。验证码 是随机产生的同时它不仅仅是单纯的图片或数字,只有输入的验证码正确之后才会去后台数据库做验证,从而防止暴力破解。

二、示例讲解

  创建一个ASP.NET程序,单独添加一个Web页面用于生成验证码,相关代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using System.Drawing;
using System.IO;
using System.Drawing.Imaging;

namespace UI
{
    public partial class ValidateCodeCopy : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if(!IsPostBack)
            {
                //生成一个四位的随机码
                string validateCode = RndNum(4);
                //将随机码保存到session中
                Session["ValidateCode"] = validateCode;
                CreateImage(validateCode);
            
            }

            
        }

        /// <summary>
        /// 生成一个随机码
        /// </summary>
        /// <param name="VCodeNum">随机码的位数</param>
        /// <returns></returns>
        public string RndNum(int VCodeNum )
        {
            string VNUM = "";

            string Vchar = "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z";

            String[] VcArray = Vchar.Split(new char[]{','});

            Random rd = new Random();

            for (int i = 0; i <= VCodeNum - 1;i++)
            {
                int t = rd.Next(36);
                VNUM += VcArray[t];
            }
            return VNUM;
        
        }


        /// <summary>
        /// 生成随机颜色
        /// </summary>
        /// <returns></returns>
        public Color GetRandomColor()
        {
            Random Rd_First = new Random((int)DateTime.Now.Ticks);

            Random Rd_Second = new Random((int)DateTime.Now.Ticks);
            //生成三个随机数
            int red = Rd_First.Next(256);
            int Green = Rd_Second.Next(256);
            int blue = (red + Green) > 400 ? 0 : 400 - red + Green;
            blue = blue > 255 ? 255 : blue;

            return Color.FromArgb(red,Green, blue);
        
        }
        /// <summary>
        /// 将随机码绘制到图像,写入输出流
        /// </summary>
        /// <param name="str_ValidateCode">随机码</param>
        public void CreateImage(string str_ValidateCode)
        {
            int int_imageWidth = str_ValidateCode.Length * 20;
            Bitmap thebitmap = new Bitmap(int_imageWidth,40);

            Random rd = new Random();
            Graphics Gr = Graphics.FromImage(thebitmap);
            Gr.Clear(Color.White);

            Gr.DrawRectangle(new Pen(Color.LightGray, 1),0,0,int_imageWidth-1,39);

            Font font = new Font("Arial",16);

            for (int int_index = 0; int_index < str_ValidateCode.Length;int_index++ )
            {
                string str_char = str_ValidateCode.Substring(int_index,1);

                Brush newBrush = new SolidBrush(GetRandomColor());

                Point thePos = new Point(int_index * 20 + 1 + rd.Next(3), 3+ rd.Next(3));
                Gr.DrawString(str_char, font, newBrush, thePos);
            }

            MemoryStream ms = new MemoryStream();
            thebitmap.Save(ms, ImageFormat.Jpeg);
            Response.ClearContent();
            Response.ContentType = "image/jpeg";
            Response.BinaryWrite(ms.ToArray());

            Gr.Dispose();
            thebitmap.Dispose();
            Response.End();
        
        
        }


    }
}

另外添加一张web页面 用于获取验证码,其前端HTML代码如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="UI.Test" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">

    <table>
        <tr>
            <td><img src="ValidateCodeCopy.aspx" name="yzm" id="yzm"  alt="" /></td>
            <td><a href="#" onclick="yzm.src='ValidateCodeCopy.aspx?t='+(new Date().getTime());return false;">看不清,换一张?</a></td>
        </tr>
    </table>
            
    
    
    </form>
</body>
</html>

这样一个简单的验证码就实现了。

                                                                                                                       不积跬步无以至千里

 

 

posted on 2015-11-12 15:50  MyPersistence  阅读(1288)  评论(0编辑  收藏  举报