zoukankan      html  css  js  c++  java
  • 由数字与字母组成的验证码的实现

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

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

    二、示例讲解

      创建一个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>

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

                                                                                                                           不积跬步无以至千里

     

     

  • 相关阅读:
    智器SmartQ T7实体店试用体验
    BI笔记之SSAS库Process的几种方案
    PowerTip of the Day from powershell.com上周汇总(八)
    PowerTip of the Day2010071420100716 summary
    PowerTip of the Day from powershell.com上周汇总(十)
    PowerTip of the Day from powershell.com上周汇总(六)
    重新整理Cellset转Datatable
    自动加密web.config配置节批处理
    与DotNet数据对象结合的自定义数据对象设计 (二) 数据集合与DataTable
    在VS2003中以ClassLibrary工程的方式管理Web工程.
  • 原文地址:https://www.cnblogs.com/YanYongSong/p/4959286.html
Copyright © 2011-2022 走看看