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






3.94/5 (11投票s)
2006年12月8日
2分钟阅读

90633

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 应用程序的安全性中发挥非常重要的作用。
希望您喜欢这篇文章,祝您编程愉快!