65.9K
CodeProject 正在变化。 阅读更多。
Home

在 ASP.NET 中创建类似 CAPTCHA 的功能

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.94/5 (11投票s)

2006年12月8日

2分钟阅读

viewsIcon

90633

downloadIcon

7286

如何在 ASP.NET 中创建类似 CAPTCHA 的功能。

引言

根据维基百科的定义,CAPTCHA(“完全自动化公共图灵测试以区分计算机和人类”)是一种挑战-响应测试,用于检查用户是否为人类。 CAPTCHA 仅用于需要用户输入的应用中,例如博客、论坛和门户网站。 在本文中,我将演示如何创建一个使用 CAPTCHA 功能的简单网页。

CreateImage 方法

第一步是创建一个图像并将其显示在屏幕上。为此,我创建了一个名为 CaptchaControl.aspx 的 ASP.NET 页面。 CaptchaControl.aspx 页面将负责向用户显示图像。 让我们看一下生成图像的代码:

private void CreateImage()
{

    string code = GetRandomText();
    Bitmap bitmap = new Bitmap(200,150,
           System.Drawing.Imaging.PixelFormat.Format32bppArgb);
    Graphics g = Graphics.FromImage(bitmap);
    Pen pen = new Pen(Color.Yellow);
    Rectangle rect = new Rectangle(0,0,200,150);
    SolidBrush b = new SolidBrush(Color.DarkKhaki);
    SolidBrush blue = new SolidBrush(Color.Blue);
    int counter = 0;
    g.DrawRectangle(pen, rect);
    g.FillRectangle(b, rect);

    for (int i = 0; i < code.Length; i++)
    {
        g.DrawString(code[i].ToString(), 
           new Font("Verdena", 10 + rand.Next(14, 18)), 
           blue, new PointF(10 + counter, 10));
        counter += 20;
    }

    DrawRandomLines(g);
    Response.ContentType = "image/gif";
    bitmap.Save(Response.OutputStream,ImageFormat.Gif);
    g.Dispose();
    bitmap.Dispose();

}

CreateImage 方法内部进行了一系列操作。 GetRandomText 方法生成随机文本并将其返回给调用者。 如果您不熟悉创建随机字符串,我建议您查看我的文章:创建随机密码。 在创建文本将要显示的 Rectangle 之后,我调整文本大小以使其看起来很奇怪。 最后,我调用 DrawRandomLines 方法,该方法可以保护图像免受 OCR 软件的攻击。

GetRandomText 方法

GetRandomText 方法的目的是每次用户输入错误的文本时生成一个随机文本。 请查看返回随机文本的简单方法。

private string GetRandomText()
{

    StringBuilder randomText = new StringBuilder();

    if (Session["Code"] == null)
    {

        string alphabets = "abcdefghijklmnopqrstuvwxyz";
        Random r = new Random();

        for (int j = 0; j <= 5; j++)
        {
            randomText.Append(alphabets[r.Next(alphabets.Length)]);
        }
        Session["Code"] = randomText.ToString();
    }
    return Session["Code"] as String;
}

DrawRandomLines 方法

DrawRandomLines 方法在图像上显示的文本上绘制线条。 这些线条的目的是使机器人难以读取文本。 这样,只有人类才能读取文本。

private void DrawRandomLines(Graphics g)
{
    SolidBrush green = new SolidBrush(Color.Green);

    for (int i = 0; i < 20; i++)
    {
        g.DrawLines(new Pen(green, 2), GetRandomPoints());
    }

}

private Point[] GetRandomPoints()
{

    Point[] points = { new Point(rand.Next(10, 150), 
                       rand.Next(10, 150)), 
                       new Point(rand.Next(10, 100), 
                       rand.Next(10, 100)) };
    return points;
}

使用 CAPTCHA 页面

我们已经创建了 CAPTCHA 功能,但问题是如何使用它。 为了使用 CAPTCHA 功能,您需要创建一个使用 CaptchaControl.aspx 页面作为 ASP.NET Image 控件的 ImageUrl 的页面。 请查看 Default.aspx 页面的完整 HTML 代码。

<form id="form1" runat="server">
<div>
<asp:Image ID="myImage" runat="server" 
     ImageUrl="~/CaptchaControl.aspx" />
<br />
<br />
Enter code: <asp:TextBox ID="TextBox1" runat="server">
            </asp:TextBox>
<asp:Button ID="Button1" runat="server" 
     Text="Validate" OnClick="Button1_Click" />
<br />
<br />
<asp:Label ID="lblError" runat="server" Font-Bold="True" 
     Font-Size="X-Large" ForeColor="Red"></asp:Label></div>
</form>

重要的是要注意 ASP.NET Image 控件,它请求 CaptchaControl.aspx 页面并生成图像。 用户文本与 CAPTCHA 文本的验证代码非常简单,您可以在下载的文件中查看它。

以下是应用程序外观的图像

结论

在本文中,我演示了创建 CAPTCHA 功能是多么容易。 此功能可以在 Web 应用程序的安全性中发挥非常重要的作用。

希望您喜欢这篇文章,祝您编程愉快!

© . All rights reserved.