Kleine Klasse: Die Rolle des Bestätigungscodes:
Vor einigen Jahren verfügten die meisten Websites, Foren und dergleichen nicht über Bestätigungscodes, da Bestätigungscodes für normale Benutzer nur zu einer Reduzierung der Benutzeroperationen führten Erfahrung. Allerdings tauchten in einem endlosen Strom verschiedene Spam-Roboter, Abstimmungsroboter und böswillige Registrierungsroboter auf, was die Belastung der Website erheblich erhöhte und auch eine große Menge Junk-Daten in die Datenbank der Website brachte. Um die Zerstörung verschiedener Roboterprogramme zu verhindern, haben Programmierer Verifizierungscodes entwickelt, die nur vom menschlichen Auge erkannt werden können und von Programmen nicht leicht erkannt werden!
Der Verifizierungscode ist ein Bild mit Buchstaben, Zahlen und sogar chinesischen Schriftzeichen als Bildinhalt. Der Inhalt eines solchen Bildes ist mit dem menschlichen Auge leicht zu erkennen, das Programm ist jedoch nicht in der Lage um es zu identifizieren. Vor der Durchführung von Datenbankvorgängen (z. B. Anmeldebestätigung, Abstimmung, Veröffentlichung, Antwort, Registrierung usw.) überprüft das Programm zunächst, ob der vom Client übermittelte Bestätigungscode mit dem Inhalt im Bild übereinstimmt. Es werden Datenbankoperationen ausgeführt. Wenn dies nicht der Fall ist, wird ein Verifizierungscodefehler angezeigt. Es werden keine Datenbankoperationen ausgeführt. Auf diese Weise werden alle Arten von Roboterprogrammen blockiert!
Aber mit der Entwicklung der Informatik werden Technologien wie die Mustererkennung immer ausgereifter, sodass der Typ, der das Roboterprogramm schreibt, den direkt in das Bild geschriebenen Inhalt über das Programm erkennen und dann einreichen kann Senden Sie ihn zur Überprüfung an den Server. Der Code ist nutzlos. Um die Erkennung von Roboterprogrammen zu verhindern, wird auch die Bildgenerierung von Verifizierungscodes ständig weiterentwickelt, indem Störpunkte, Störlinien, Textverformungen, sich ändernde Winkelpositionen, verschiedene Farben usw. hinzugefügt werden. Außerdem werden verschiedene Technologien zur Verhinderung der Computererkennung angewendet Verifizierungscodes. Im Wettbewerb zwischen diesen beiden Technologien entsteht der Verifizierungscode, den wir jetzt sehen. Viele Leute beschweren sich bereits: „Was ist das für ein Verifizierungscode? Das menschliche Auge kann nicht erkennen, was das ist.“
Um die Funktion des Bestätigungscodes zu verstehen, schreiben wir ein einfaches Beispiel für die Generierung und Verwendung des Bestätigungscodes
Erstellen Sie zunächst eine Seite, um den Bestätigungscode anzuzeigen und Stellen Sie fest, ob der Bestätigungscode korrekt eingegeben wurde
<html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script> <script type="text/javascript"> //点击切换验证码 function f_refreshtype() { var Image1 = document.getElementById("img"); if (Image1 != null) { Image1.src = Image1.src + "?"; } } </script> </head> <body> <form id="form1" runat="server"> <div> <table> <tr> <td> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> </td> <td> <img src="png.aspx" id="img" onclick="f_refreshtype()" / alt="So generieren und verwenden Sie einen .net-Bestätigungscode" > </td> <td> <asp:Button ID="Button1" runat="server" Text="确定" /> </td> </tr> </table> </div> </form> </body> </html>
Der Bestätigungscode wird im Hintergrund dieser Seite überprüft
protected void Page_Load(object sender, EventArgs e) { //生成的验证码被保存到session中 if (Session["CheckCode"] != null) { string checkcode = Session["CheckCode"].ToString(); if (this.TextBox1.Text == checkcode) { ClientScript.RegisterClientScriptBlock(this.GetType(), "", "alert('验证码输入正确!')", true); } else { ClientScript.RegisterClientScriptBlock(this.GetType(), "", "alert('验证码输入错误!')", true); } } }
Bestätigungscodeseite png.aspx generieren
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { CreateCheckCodeImage(GenerateCheckCodes(4)); } } public void ShowAuthCode(Stream stream, out string code) { Random random = new Random(); code = random.Next(1000, 9999).ToString(); Bitmap bitmap = CreateAuthCode(code); bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Gif); } private string GenerateCheckCodes(int iCount) { int number; string checkCode = String.Empty; int iSeed = DateTime.Now.Millisecond; System.Random random = new Random(iSeed); for (int i = 0; i < iCount; i++) { number = random.Next(10); checkCode += number.ToString(); } Session["CheckCode"] = checkCode; return checkCode; } private Bitmap CreateAuthCode(string str) { Font fn = new Font("宋体", 12); Brush forecolor = Brushes.Black; Brush bgcolor = Brushes.White; PointF pf = new PointF(5, 5); Bitmap bitmap = new Bitmap(100, 25); Rectangle rec = new Rectangle(0, 0, 100, 25); Graphics gh = Graphics.FromImage(bitmap); gh.FillRectangle(bgcolor, rec); gh.DrawString(str, fn, forecolor, pf); return bitmap; } private void CreateCheckCodeImage(string checkCode) { if (checkCode == null || checkCode.Trim() == String.Empty) return; int iWordWidth = 15; int iImageWidth = checkCode.Length * iWordWidth; Bitmap image = new Bitmap(iImageWidth, 20); Graphics g = Graphics.FromImage(image); try { //生成随机生成器 Random random = new Random(); //清空图片背景色 g.Clear(Color.White); //画图片的背景噪音点 for (int i = 0; i < 20; 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); } //画图片的背景噪音线 for (int i = 0; i < 2; i++) { int x1 = 0; int x2 = image.Width; int y1 = random.Next(image.Height); int y2 = random.Next(image.Height); if (i == 0) { g.DrawLine(new Pen(Color.Gray, 2), x1, y1, x2, y2); } } for (int i = 0; i < checkCode.Length; i++) { string Code = checkCode[i].ToString(); int xLeft = iWordWidth * (i); random = new Random(xLeft); int iSeed = DateTime.Now.Millisecond; int iValue = random.Next(iSeed) % 4; if (iValue == 0) { Font font = new Font("Arial", 13, (FontStyle.Bold | System.Drawing.FontStyle.Italic)); Rectangle rc = new Rectangle(xLeft, 0, iWordWidth, image.Height); LinearGradientBrush brush = new LinearGradientBrush(rc, Color.Blue, Color.Red, 1.5f, true); g.DrawString(Code, font, brush, xLeft, 2); } else if (iValue == 1) { Font font = new System.Drawing.Font("楷体", 13, (FontStyle.Bold)); Rectangle rc = new Rectangle(xLeft, 0, iWordWidth, image.Height); LinearGradientBrush brush = new LinearGradientBrush(rc, Color.Blue, Color.DarkRed, 1.3f, true); g.DrawString(Code, font, brush, xLeft, 2); } else if (iValue == 2) { Font font = new System.Drawing.Font("宋体", 13, (System.Drawing.FontStyle.Bold)); Rectangle rc = new Rectangle(xLeft, 0, iWordWidth, image.Height); LinearGradientBrush brush = new LinearGradientBrush(rc, Color.Green, Color.Blue, 1.2f, true); g.DrawString(Code, font, brush, xLeft, 2); } else if (iValue == 3) { Font font = new System.Drawing.Font("黑体", 13, (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Bold)); Rectangle rc = new Rectangle(xLeft, 0, iWordWidth, image.Height); LinearGradientBrush brush = new LinearGradientBrush(rc, Color.Blue, Color.Green, 1.8f, true); g.DrawString(Code, font, brush, xLeft, 2); } } //////画图片的前景噪音点 //for (int i = 0; i < 8; 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.BinaryWrite(ms.ToArray()); } finally { g.Dispose(); image.Dispose(); } }
Weitere Artikel zur Generierung und Verwendung von .net-Bestätigungscodes finden Sie auf der chinesischen PHP-Website!