• 数字验证码


    网络经常有人利用机器人程序自动注册、登录、灌水从而对网站安全性构成了严重威胁。为了进一步保证安全性,越来越多的网站开始采用动态生成的图形码或附加码进行验证。验证码技术就是在服务器端,生成一个随机数,并保存在内存中,然后将随机数写入设计好的图片中,发送给浏览器,并以图片形式显示给最终的用户。通过使用验证码后,自动注册程序无法再轻易地注册和破坏。本实例实现的是绘制一个简单的纯数字验证码,并对绘制数字设置了随机彩色点。

    以下就贴出主要的验证码页面的代码供需要的朋友们参考:

    protected void Page_Load(object sender, EventArgs e)
    {

    HttpContext.Current.Session[
    "CheckCode"]=RndNum(4);
    checkCodes(HttpContext.Current.Session[
    "CheckCode"].ToString());
    }

    

    /// <summary>
    /// 生成随机的字母
    /// </summary>
    /// <param name="VcodeNum">生成字母的个数</param>
    /// <returns>string</returns>
    private string RndNum(int VcodeNum)
    {
    string Vchar = "0,1,2,3,4,5,6,7,8,9";
    string[] VcArray = Vchar.Split(',');
    string VNum = ""; //由于字符串很短,就不用StringBuilder了
    int temp = -1; //记录上次随机数值,尽量避免生产几个一样的随机数
    //采用一个简单的算法以保证生成随机数的不同
    Random rand = new Random();
    for (int i = 1; i < VcodeNum + 1; i++)
    {
    if (temp != -1)
    {
    rand
    = new Random(i * temp * unchecked((int)DateTime.Now.Ticks));
    }
    int t = rand.Next(VcArray.Length);
    if (temp != -1 && temp == t)
    {
    return RndNum(VcodeNum);
    }
    temp
    = t;
    VNum
    += VcArray[t];
    }
    return VNum;
    }

    

    /// <summary>
    /// 生成验证图片
    /// </summary>
    /// <param name="checkCode">验证字符</param>
    private void checkCodes(string checkCode)
    {
    int iwidth = (int)(checkCode.Length * 13);
    System.Drawing.Bitmap image
    = new System.Drawing.Bitmap(iwidth, 23);
    Graphics g
    = Graphics.FromImage(image);
    g.Clear(Color.White);
    //定义颜色
    Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
    //定义字体
    string[] font = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };
    Random rand
    = new Random();
    //随机输出噪点
    for (int i = 0; i < 50; i++)
    {
    int x = rand.Next(image.Width);
    int y = rand.Next(image.Height);
    g.DrawRectangle(
    new Pen(Color.LightGray, 0), x, y, 1, 1);
    }

    //输出不同字体和颜色的验证码字符
    for (int i = 0; i < checkCode.Length; i++)
    {
    int cindex = rand.Next(7);
    int findex = rand.Next(5);

    Font f
    = new System.Drawing.Font(font[findex], 10, System.Drawing.FontStyle.Bold);
    Brush b
    = new System.Drawing.SolidBrush(c[cindex]);
    int ii = 4;
    if ((i + 1) % 2 == 0)
    {
    ii
    = 2;
    }
    g.DrawString(checkCode.Substring(i,
    1), f, b, 3 + (i * 12), ii);
    }
    //画一个边框
    g.DrawRectangle(new Pen(Color.Black, 0), 0, 0, image.Width - 1, image.Height - 1);
    //输出到浏览器
    System.IO.MemoryStream ms = new System.IO.MemoryStream();
    image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
    HttpContext.Current.Response.ClearContent();
    //Response.ClearContent();
    HttpContext.Current.Response.ContentType = "image/Jpeg";
    HttpContext.Current.Response.BinaryWrite(ms.ToArray());
    g.Dispose();
    image.Dispose();
    }
  • 相关阅读:
    ASP.NET页面打印技术的总结
    js传递中文参数的url到asp(jscript)解释得到的中文参数为乱码的解决方法
    header的用法(PHP)
    oracle 11g road(/dev/shm需注意)
    mysql 主从同步 Error 'Out of range value for column的问题
    linux shell 过滤特殊字符开始的行
    Oracle穿越incarnation恢复数据
    多普达A6388刷机2.3
    【忽悠普通人用】隐藏文件夹的方法
    电脑同时使用双网卡实现方法
  • 原文地址:https://www.cnblogs.com/wangsaiming/p/2091261.html
Copyright © 2020-2023  润新知