[研究][ASP.NET]WebForm圖形驗證碼(CAPTCHA)程式(二)
2022-04-14
環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C#
一般常用的 Google reCAPTCHA需要Web Server和Client可以連上Internet,但是若因特殊需求,就不能用 Google reCAPTCHA,需要一個封閉區域網路上可用的。
本篇參考這篇,只是該篇沒有完整可測試範例,本篇進行實際測試。
Simple CAPTCHA, Create Your Own in C# - CodeProject
4 Aug 2010
https://www.codeproject.com/Articles/99148/Simple-CAPTCHA-Create-Your-Own-in-Csharp
Captcha.ashx.cs
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Drawing.Text;
using System.IO;
using System.Web;
using System.Web.SessionState;
namespace WebApplication1
{
/// <summary>
/// Captcha 的摘要描述
/// </summary>
public class Captcha : IHttpHandler, IReadOnlySessionState
{
public void ProcessRequest(HttpContext context)
{
//context.Response.ContentType = "text/plain";
//context.Response.Write("Hello World");
int iHeight = 80;
int iWidth = 190;
Random oRandom = new Random();
int[] aBackgroundNoiseColor = new int[] { 150, 150, 150 };
int[] aTextColor = new int[] { 0, 0, 0 };
int[] aFontEmSizes = new int[] { 15, 20, 25, 30, 35 };
string[] aFontNames = new string[]
{
"Comic Sans MS",
"Arial",
"Times New Roman",
"Georgia",
"Verdana",
"Geneva"
};
FontStyle[] aFontStyles = new FontStyle[]
{
FontStyle.Bold,
FontStyle.Italic,
FontStyle.Regular,
FontStyle.Strikeout,
FontStyle.Underline
};
HatchStyle[] aHatchStyles = new HatchStyle[]
{
HatchStyle.BackwardDiagonal, HatchStyle.Cross,
HatchStyle.DashedDownwardDiagonal, HatchStyle.DashedHorizontal,
HatchStyle.DashedUpwardDiagonal, HatchStyle.DashedVertical,
HatchStyle.DiagonalBrick, HatchStyle.DiagonalCross,
HatchStyle.Divot, HatchStyle.DottedDiamond, HatchStyle.DottedGrid,
HatchStyle.ForwardDiagonal, HatchStyle.Horizontal,
HatchStyle.HorizontalBrick, HatchStyle.LargeCheckerBoard,
HatchStyle.LargeConfetti, HatchStyle.LargeGrid,
HatchStyle.LightDownwardDiagonal, HatchStyle.LightHorizontal,
HatchStyle.LightUpwardDiagonal, HatchStyle.LightVertical,
HatchStyle.Max, HatchStyle.Min, HatchStyle.NarrowHorizontal,
HatchStyle.NarrowVertical, HatchStyle.OutlinedDiamond,
HatchStyle.Plaid, HatchStyle.Shingle, HatchStyle.SmallCheckerBoard,
HatchStyle.SmallConfetti, HatchStyle.SmallGrid,
HatchStyle.SolidDiamond, HatchStyle.Sphere, HatchStyle.Trellis,
HatchStyle.Vertical, HatchStyle.Wave, HatchStyle.Weave,
HatchStyle.WideDownwardDiagonal, HatchStyle.WideUpwardDiagonal, HatchStyle.ZigZag
};
//Get Captcha in Session
string sCaptchaText = context.Session["Captcha"].ToString();
//Creates an output Bitmap
Bitmap oOutputBitmap = new Bitmap(iWidth, iHeight, PixelFormat.Format24bppRgb);
Graphics oGraphics = Graphics.FromImage(oOutputBitmap);
oGraphics.TextRenderingHint = TextRenderingHint.AntiAlias;
//Create a Drawing area
RectangleF oRectangleF = new RectangleF(0, 0, iWidth, iHeight);
Brush oBrush = default(Brush);
//Draw background (Lighter colors RGB 100 to 255)
oBrush = new HatchBrush(aHatchStyles[oRandom.Next
(aHatchStyles.Length - 1)], Color.FromArgb((oRandom.Next(100, 255)),
(oRandom.Next(100, 255)), (oRandom.Next(100, 255))), Color.White);
oGraphics.FillRectangle(oBrush, oRectangleF);
System.Drawing.Drawing2D.Matrix oMatrix = new System.Drawing.Drawing2D.Matrix();
int i = 0;
for (i = 0; i <= sCaptchaText.Length - 1; i++)
{
oMatrix.Reset();
int iChars = sCaptchaText.Length;
int x = iWidth / (iChars + 1) * i;
int y = iHeight / 2;
//Rotate text Random
oMatrix.RotateAt(oRandom.Next(-40, 40), new PointF(x, y));
oGraphics.Transform = oMatrix;
//Draw the letters with Random Font Type, Size and Color
oGraphics.DrawString
(
//Text
sCaptchaText.Substring(i, 1),
//Random Font Name and Style
new Font(aFontNames[oRandom.Next(aFontNames.Length - 1)],
aFontEmSizes[oRandom.Next(aFontEmSizes.Length - 1)],
aFontStyles[oRandom.Next(aFontStyles.Length - 1)]),
//Random Color (Darker colors RGB 0 to 100)
new SolidBrush(Color.FromArgb(oRandom.Next(0, 100),
oRandom.Next(0, 100), oRandom.Next(0, 100))),
x,
oRandom.Next(10, 40)
);
oGraphics.ResetTransform();
}
MemoryStream oMemoryStream = new MemoryStream();
oOutputBitmap.Save(oMemoryStream, System.Drawing.Imaging.ImageFormat.Png);
byte[] oBytes = oMemoryStream.GetBuffer();
oOutputBitmap.Dispose();
oMemoryStream.Close();
context.Response.BinaryWrite(oBytes);
context.Response.End();
}
public bool IsReusable
{
get
{
return false;
}
}
}
} |
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 ID="txtCaptcha" runat="server" AutoComplete="Off"></asp:TextBox>
<br />
<asp:Image ID="imgCaptcha" ImageUrl="Captcha.ashx" runat="server" />
<br />
<asp:Button ID="Button_Check" runat="server" Text="Check"
OnClick="Button_Check_Click" />
<asp:Button ID="Button_Refresh" runat="server" Text="Refresh"
OnClick="Button_Refresh_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)
{
Label1.Text = "";
if (!IsPostBack)
{
SetCaptchaText();
}
}
private void SetCaptchaText()
{
Random oRandom = new Random();
//int iNumber = oRandom.Next(100000, 999999);
int iNumber = oRandom.Next(1000, 9999);
Session["Captcha"] = iNumber.ToString();
}
protected void Button_Check_Click(object sender, EventArgs e)
{
if (Session["Captcha"].ToString() != txtCaptcha.Text.Trim())
{
//Response.Redirect("Failed.aspx");
Label1.Text = "Failed";
SetCaptchaText();
}
else
{
//Response.Redirect("Success.aspx");
Label1.Text = "Success";
}
}
protected void Button_Refresh_Click(object sender, EventArgs e)
{
SetCaptchaText();
}
}
} |
執行結果
(完)
相關
[研究][ASP.NET]WebForm圖形驗證碼(CAPTCHA)程式(二)
https://shaurong.blogspot.com/2022/04/aspnetwebformcaptcha_14.html
[研究][ASP.NET]WebForm圖形驗證碼(CAPTCHA)程式(一)
http://shaurong.blogspot.com/2022/04/aspnetwebformcaptcha.html
[研究]ASP.NET WebForm CAPTCHA圖形驗證碼
https://shaurong.blogspot.com/2021/12/aspnet-webform-captcha.html
Simple CAPTCHA, Create Your Own in C# - CodeProject
4 Aug 2010
https://www.codeproject.com/Articles/99148/Simple-CAPTCHA-Create-Your-Own-in-Csharp
(無完整範例,但可用)
A CAPTCHA Server Control for ASP.NET - CodeProject
2007/02/01
https://www.codeproject.com/Articles/8751/A-CAPTCHA-Server-Control-for-ASP-NET
( 程式為 VB + .NET Framework 2.0,要變更專案的屬性為 .NET Framewok 4.8,但執行仍失敗)
A Simple CAPTCHA Image Verification in C# and ASP.Net
2009/02/16
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

沒有留言:
張貼留言