Asp.net(C#)实现验证码功能代码

接下来我将为您详细讲解Asp.net(C#)实现验证码功能代码的完整攻略。

1. 简介

验证码,就是为了防止恶意机器人向网站提交请求或恶意注册而设计的一种验证方法。通过验证码,网站可以判断请求来源的真实性并提高安全性。

2. 实现过程

首先,我们需要生成一个随机的验证码,并将其显示在前台;其次,用户需要输入验证码并进行验证。下面,我将分两部分进行详细讲解。

2.1 生成验证码

我们可以使用Asp.net的GDI+图像处理功能生成验证码。具体方法如下:

public void ShowValidateCode()
{
    string validateCode = GenerateCheckCode();
    HttpContext.Current.Session["CheckCode"] = validateCode;
    System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((validateCode.Length * 12.5)), 22);
    System.Drawing.Graphics g = System.Drawing.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.Silver), x1, y1, x2, y2);
        }
        Font font = new Font("Arial", 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(validateCode, font, brush, 2, 2);
        for (int i = 0; i < 100; 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.Silver), 0, 0, image.Width - 1, image.Height - 1);
        MemoryStream ms = new MemoryStream();
        image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
        HttpContext.Current.Response.ClearContent();
        HttpContext.Current.Response.ContentType = "image/Gif";
        HttpContext.Current.Response.BinaryWrite(ms.ToArray());
    }
    finally
    {
        g.Dispose();
        image.Dispose();
    }
}

在以上代码中,我们首先生成一个随机的验证码,并将其存储到Session中以备后续验证使用。接下来,我们创建一个图像对象,使用GDI+绘制出验证码,并在绘制时使用了拉伸渐变的效果,增强了验证码的识别难度。最后使用MemoryStream存储图像,并发送给前台。

2.2 验证输入

在前台,用户会输入验证码并提交到后台验证,我们需要进行验证码的比较。具体方法如下:

if (Session["CheckCode"] == null || string.IsNullOrEmpty(Session["CheckCode"].ToString().Trim()))
{
    //验证码已经失效,请重新获取
}
else if (string.Compare(Session["CheckCode"].ToString(), chkCode.Trim(), true) != 0)
{
    //验证码输入错误,请重新输入
}
else
{
    //验证通过
}

在以上代码中,我们首先判断Session中是否存在验证码的值,如果不存在则说明验证码已经失效,需要重新获取;如果存在,则将用户输入的值和Session中存储的值进行比较,如果比较不一致,则说明输入错误,需要重新输入;如果比较一致,则说明验证通过。

3. 示例说明

下面,我将给出两个代码示例以展示以上的实现过程。

3.1 C#示例

protected void Page_Load(object sender, EventArgs e)
{
    ShowValidateCode();
}

protected void btnSubmit_Click(object sender, EventArgs e)
{
    if (Session["CheckCode"] == null || string.IsNullOrEmpty(Session["CheckCode"].ToString().Trim()))
    {
        Response.Write("<script>alert('验证码已经失效,请重新获取')</script>");
    }
    else if (string.Compare(Session["CheckCode"].ToString(), txtCode.Text.Trim(), true) != 0)
    {
        Response.Write("<script>alert('验证码输入错误,请重新输入')</script>");
    }
    else
    {
        Response.Write("<script>alert('验证通过')</script>");
    }
}

public void ShowValidateCode()
{
    string validateCode = GenerateCheckCode();
    Session["CheckCode"] = validateCode;
    System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((validateCode.Length * 12.5)), 22);
    System.Drawing.Graphics g = System.Drawing.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.Silver), x1, y1, x2, y2);
        }
        Font font = new Font("Arial", 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(validateCode, font, brush, 2, 2);
        for (int i = 0; i < 100; 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.Silver), 0, 0, image.Width - 1, image.Height - 1);
        MemoryStream ms = new MemoryStream();
        image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
        Response.ClearContent();
        Response.ContentType = "image/Gif";
        Response.BinaryWrite(ms.ToArray());
    }
    finally
    {
        g.Dispose();
        image.Dispose();
    }
}

private string GenerateCheckCode()
{
    char[] chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
    StringBuilder sb = new StringBuilder();
    Random random = new Random();
    for (int i = 0; i < 4; i++)
    {
        int index = random.Next(chars.Length);
        sb.Append(chars[index]);
    }
    return sb.ToString();
}

以上示例展示了一套完整的验证码实现过程,包含了验证码的生成和比较,可以直接在项目中进行使用。

3.2 HTML和JavaScript示例

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>验证码示例</title>
    <script type="text/javascript">
        function refresh() {
            document.getElementById("imgCode").src = "ValidateCode.ashx?" + Math.random();
        }
        function validate() {
            var code = document.getElementById("txtCode").value;
            if (code == "") {
                alert("请输入验证码!");
                return false;
            }
            else {
                //向后台请求,验证验证码
                return true;
            }
        }
    </script>
</head>
<body>
    <form action="#" method="post" onsubmit="return validate()">
        <p>请输入验证码:<input type="text" id="txtCode" /><img id="imgCode" src="ValidateCode.ashx" style="cursor: pointer;" onclick="refresh()" /></p>
        <p><input type="submit" value="提交" /></p>
    </form>
</body>
</html>

以上示例展示了一个HTML页面及其附带的JavaScript代码,包含了验证码的显示和刷新以及输入的验证,可以直接在Web开发中进行使用。

4. 总结

以上,就是Asp.net(C#)实现验证码功能代码的完整攻略。通过以上的实现过程,我们可以更好地加强网站的安全性,防止恶意攻击。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Asp.net(C#)实现验证码功能代码 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • C#实现软件监控外部程序运行状态的方法

    C#实现软件监控外部程序运行状态的方法可以通过使用System.Diagnostics命名空间中的Process类来实现。本文将详细介绍如何使用C#实现软件监控外部程序运行状态的方法,并提供两个示例来演示如何使用Process类。 使用Process类监控外部程序运行状态 Process类是System.Diagnostics命名空间中的一个类,它可以用于启…

    C# 2023年5月15日
    00
  • C#实现一个控制台的点餐系统

    C#实现一个控制台的点餐系统完整攻略 需求分析 点餐系统需要实现以下功能: 展示菜单 输入点餐内容和数量 确认订单及计算总价 退出程序 设计实现 数据结构 点餐系统需要用到的数据结构有: 菜品类别 Category 菜品类 Dish 菜单类 Menu 订单类 Order 具体定义如下: // 菜品类别 public enum Category { 饮料, 小…

    C# 2023年6月7日
    00
  • C#实现判断文件夹存在与否并创建文件夹的方法

    要判断文件夹是否存在并创建文件夹,可以使用C#中的Directory类。它包含了一些用于创建、删除和查询目录信息的静态方法,具体实现步骤如下: 步骤1:引入命名空间 在代码文件的顶部添加以下代码引入System.IO命名空间,从而使用其中的Directory类: using System.IO; 步骤2:判断文件夹是否存在 判断文件夹是否存在,可以使用Dir…

    C# 2023年6月8日
    00
  • c#一个定时重启的小程序实现代码第1/2页

    “c#一个定时重启的小程序实现代码”是一个面向Windows操作系统开发的应用程序,用于定时重启计算机。具体的实现思路如下: 获取重启时间 首先需要获取用户设定的重启时间,可通过以下代码实现: DateTime restartTime = new DateTime(year, month, day, hour, minute, second); 其中year…

    C# 2023年6月1日
    00
  • 使用Node.js实现ORM的一种思路详解(图文)

    使用Node.js实现ORM(对象关系映射)是一种常见的技术需求,它可以帮助开发者更好、更方便地操作数据库。下面将详细讲解一种使用Node.js实现ORM的思路。 什么是ORM? ORM(Object-Relational Mapping)即对象关系映射,是一种编程技术,用于将面向对象编程语言中的对象模型与关系型数据库中的数据模型相互映射。ORM可以通过一系…

    C# 2023年6月3日
    00
  • C#在DataTable中根据条件删除某一行的实现方法

    下面是C#在DataTable中根据条件删除某一行的实现方法的完整攻略及示例: 1. DataTable中删除某一行的方法 要删除DataTable中的某一行,我们可以使用DataTable.Rows属性来遍历各行数据,再通过DataRow对象提供的Delete()方法来删除符合条件的行。 下面是示例代码: DataTable dt = new DataTa…

    C# 2023年6月6日
    00
  • 在C#中捕获内存不足异常

    在C#中,当应用程序需要使用更多内存而系统没有足够的内存可用时,就会发生内存不足异常。在这种情况下,应用程序可以捕获此异常来处理或记录错误并采取必要的措施避免程序崩溃。下面是在C#中捕获内存不足异常的完整攻略: 1. 使用try-catch语句捕获内存不足异常 在C#中,使用try-catch语句捕获内存不足异常是一种常见的方法。下面是一个基本的示例: tr…

    C# 2023年5月15日
    00
  • C#中关于double.ToString()的用法

    下面是关于C#中double.ToString()用法的完整攻略。 double.ToString() 介绍 double.ToString() 是一个用于将 double 类型的变量转换为字符串的方法。在 C# 中,ToString() 方法通常用于将不同类型的变量转换为字符串,以便更容易地输出、处理或者保存。 使用 double.ToString() 方…

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部