.net实现验证码功能


一、验证码简介
  验证码功能一般是用于防止批量注册的,不少网站为了防止用户利用机器人自动注册、登录、灌水,都采用了验证码技术。所谓验证码,就是将一串随机产生的数字或字母或符号或文字,生成一幅图片, 图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。

  常见的验证码有如下几种: 
  1、纯数字验证码,一般为四位随机数字;
  2、数字+字母验证码,一般从数字(0~9)和字母(A~Z和a~z)中随机抽出几个字符组成;
  3、汉字验证码,相对而言,这种验证码比较少见一点,实现起来也相对复杂一些,但在不少网站中还是可以看到的;

  二、验证码的实现
  1、纯数字验证码的实现
  
纯数字验证码的实现相对比较简单,可通过以下两种方法来实现
  (1)使用随机数方式,代码如下: 

复制代码
         private  String GetRandomint( int  codeCount)
        {
            Random random 
=   new  Random();
            
string  min  =   "" ;
            
string  max  =   "" ;
            
for  ( int  i  =   0 ; i  <  codeCount; i ++ )
            {
                min 
+= " 1 " ;
                max
+= " 9 " ;
            }
                
return  (random.Next(Convert.ToInt32(min),Convert.ToInt32(max)).ToString());
        }
复制代码


   (2)使用随机组合方式,代码如下:

复制代码
         private   string  CreateRandomCode( int  codeCount)
        {
            
string  allChar  =   " 0,1,2,3,4,5,6,7,8,9 "
            
string [] allCharArray  =  allChar.Split( ' , ' ); 
            
string  randomCode  =   ""
            
int  temp  =   - 1
            Random rand 
=   new  Random(); 
            
for  ( int  i  =   0 ; i  <  codeCount; i ++
            { 
                
if  (temp  !=   - 1
                { 
                    rand 
=   new  Random(i  *  temp  *  (( int )DateTime.Now.Ticks)); 
                } 
                
int  t  =  rand.Next( 9 ); 
                
if  (temp  ==  t) 
                { 
                    
return  CreateRandomCode(codeCount); 
                } 
                temp 
=  t; 
                randomCode 
+=  allCharArray[t]; 
            } 
            
return  randomCode;
        }
复制代码


  2、数字+字母验证码的实现,代码如下:

复制代码
         private   string  CreateRandomCode( int  codeCount)
        {
            
string  allChar  =   " 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,W,X,Y,Z,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 [] allCharArray  =  allChar.Split( ' , ' ); 
            
string  randomCode  =   ""
            
int  temp  =   - 1
            Random rand 
=   new  Random(); 
            
for  ( int  i  =   0 ; i  <  codeCount; i ++
            { 
                
if  (temp  !=   - 1
                { 
                    rand 
=   new  Random(i  *  temp  *  (( int )DateTime.Now.Ticks)); 
                } 
                
int  t  =  rand.Next( 61 ); 
                
if  (temp  ==  t) 
                { 
                    
return  CreateRandomCode(codeCount); 
                } 
                temp 
=  t; 
                randomCode 
+=  allCharArray[t]; 
            } 
            
return  randomCode;
        }
复制代码


  3、汉字验证码的实现,代码如下: 

复制代码
         /**/
        
/*  
    此函数在汉字编码范围内随机创建含两个元素的十六进制字节数组,每个字节数组代表一个汉字,并将 
    四个字节数组存储在object数组中。 
    参数:strlength,代表需要产生的汉字个数 
    
*/
        
public   static   object [] CreateRegionCode( int  strlength)
        {
            
// 定义一个字符串数组储存汉字编码的组成元素 
             string [] rBase  =   new  String[ 16 ] {  " 0 " " 1 " " 2 " " 3 " " 4 " " 5 " " 6 " " 7 " " 8 " " 9 " " a " " b " " c " " d " " e " " f "  };
            Random rnd 
=   new  Random();
            
// 定义一个object数组用来 
             object [] bytes  =   new   object [strlength];

            
/**/
            
/* 每循环一次产生一个含两个元素的十六进制字节数组,并将其放入bject数组中 
         每个汉字有四个区位码组成 
         区位码第1位和区位码第2位作为字节数组第一个元素 
         区位码第3位和区位码第4位作为字节数组第二个元素 
        
*/
            
for  ( int  i  =   0 ; i  <  strlength; i ++ )
            {
                
// 区位码第1位 
                 int  r1  =  rnd.Next( 11 14 );
                
string  str_r1  =  rBase[r1].Trim();

                
// 区位码第2位 
                rnd  =   new  Random(r1  *   unchecked (( int )DateTime.Now.Ticks)  +  i); // 更换随机数发生器的种子避免产生重复值 
                 int  r2;
                
if  (r1  ==   13 )
                {
                    r2 
=  rnd.Next( 0 7 );
                }
                
else
                {
                    r2 
=  rnd.Next( 0 16 );
                }
                
string  str_r2  =  rBase[r2].Trim();

                
// 区位码第3位 
                rnd  =   new  Random(r2  *   unchecked (( int )DateTime.Now.Ticks)  +  i);
                
int  r3  =  rnd.Next( 10 16 );
                
string  str_r3  =  rBase[r3].Trim();

                
// 区位码第4位 
                rnd  =   new  Random(r3  *   unchecked (( int )DateTime.Now.Ticks)  +  i);
                
int  r4;
                
if  (r3  ==   10 )
                {
                    r4 
=  rnd.Next( 1 16 );
                }
                
else   if  (r3  ==   15 )
                {
                    r4 
=  rnd.Next( 0 15 );
                }
                
else
                {
                    r4 
=  rnd.Next( 0 16 );
                }
                
string  str_r4  =  rBase[r4].Trim();

                
// 定义两个字节变量存储产生的随机汉字区位码 
                 byte  byte1  =  Convert.ToByte(str_r1  +  str_r2,  16 );
                
byte  byte2  =  Convert.ToByte(str_r3  +  str_r4,  16 );
                
// 将两个字节变量存储在字节数组中 
                 byte [] str_r  =   new   byte [] { byte1, byte2 };

                
// 将产生的一个汉字的字节数组放入object数组中 
                bytes.SetValue(str_r, i);
            }
            
return  bytes;
        }
复制代码
   三、具体实例 
  (实例1)
 
前台代码display.aspx
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值