[研究][ASP.NET]WebForm圖形驗證碼(CAPTCHA)程式
2022-04-04
環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C#
一般常用的 Google reCAPTCHA需要Web Server和Client可以連上Internet,但是若因特殊需求,就不能用 Google reCAPTCHA,需要一個封閉區域網路上可用的。
Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
Inherits="WebApplication1.Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
驗證碼<asp:TextBox AutoComplete="Off" ID="txtCheckCode" Width="60"
runat="server"></asp:TextBox>
<img src="/GenerateCaptchaCodeImage.aspx" width="69" height="20" />
<br />
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
<br />
<asp:Label ID="Label1" runat="server"></asp:Label>
</div>
</form>
</body>
</html> |
Default.aspx.cs
using System;
namespace WebApplication1
{
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
if (string.Compare(Session["CheckCode"].ToString(), txtCheckCode.Text, true) != 0)
{
Response.Write("<script>alert('圖片驗證碼錯誤');</script>");
Label1.ForeColor = System.Drawing.Color.Red;
Label1.Text = "圖片驗證碼錯誤";
return;
}
else
{
Response.Write("<script>alert('圖片驗證碼成功');</script>");
Label1.ForeColor = System.Drawing.Color.Green;
Label1.Text = "圖片驗證碼成功";
}
}
}
} |
GenerateCaptchaCodeImage.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="GenerateCaptchaCodeImage.aspx.cs" Inherits="WebApplication1.GenerateCaptchaCodeImage" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <form id="form1" runat="server"> <div> </div> </form> </body> </html> |
GenerateCaptchaCodeImage.aspx.cs
using System; using System.Drawing; using System.Web; namespace WebApplication1 { public partial class GenerateCaptchaCodeImage : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { this.CreateCheckCodeImage(GenerateCheckCode()); } private string GenerateCheckCode() { int number; char code; string checkCode = string.Empty; System.Random random = new Random(); for (int i = 0; i < 4; i++) { number = random.Next(); if (number % 2 == 0) code = (char)('0' + (char)(number % 10)); else code = (char)('A' + (char)(number % 26)); checkCode += code.ToString(); } Session["CheckCode"] = checkCode; Response.Cookies.Add(new HttpCookie("CheckCode", checkCode)); return checkCode; } private void CreateCheckCodeImage(string checkCode) { if (checkCode == null || checkCode.Trim() == string.Empty) return; //System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length * 12.5)), 22); //System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length * 20)), 40); System.Drawing.Bitmap image = new System.Drawing.Bitmap(100, 30); Graphics g = 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 System.Drawing.Font("Arial", 22, (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(checkCode, font, brush, 2, 2); g.DrawString(checkCode, font, brush, 2, 2); //畫圖片的前景噪音點 for (int i = 0; i < 500; 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); System.IO.MemoryStream ms = new System.IO.MemoryStream(); image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif); Response.ClearContent(); Response.ContentType = "image/Gif"; Response.BinaryWrite(ms.ToArray()); } finally { g.Dispose(); image.Dispose(); } } } } |
(完)
相關
浮雲雅築: [研究]ASP.NET WebForm CAPTCHA圖形驗證碼
https://shaurong.blogspot.com/2021/12/aspnet-webform-captcha.html
Simple CAPTCHA, Create Your Own in C# - CodeProject
https://www.codeproject.com/Articles/99148/Simple-CAPTCHA-Create-Your-Own-in-Csharp
A CAPTCHA Server Control for ASP.NET - CodeProject
https://www.codeproject.com/Articles/8751/A-CAPTCHA-Server-Control-for-ASP-NET
A Simple CAPTCHA Image Verification in C# and ASP.Net
http://www.codedigest.com/CodeDigest/88-A-Simple-CAPTCHA-Image-Verification-in-C--and-ASP-Net.aspx
使用 CAPTCHA 防止 bot 使用您的 ASP.NET Web Razor) 網站
https://docs.microsoft.com/zh-tw/aspnet/web-pages/overview/security/using-a-catpcha-to-prevent-automated-programs-bots-from-using-your-aspnet-web-site
沒有留言:
張貼留言