Création d'un Captcha en asp.net C#

Comment créer un Captcha en asp.net C# pour sécuriser un formulaire afin de ne pas être utilisé par des logiciels robot ? 



Dans la page .aspx (HTML) :

<asp:TextBox ID="txtCaptchaCode" runat="server" style="width:208px;padding:5px;" placeholder="Recopiez le code ci-dessous"></asp:TextBox>
<div style="height:10px;"></div>
<asp:Image ID="imgCaptchaImage" runat="server" />
<div style="height:20px;"></div>
<asp:Button id="envoyer" runat="server" Text="Envoyer" onclick="envoyer_Click"></asp:Button>
 

Dans la page .aspx.cs :

Dans les using :

using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;

Avant la procédure Page_Load :

private string captchaText;
private int width = 150;
private int height = 45;
private Random rnd = new Random();

Dans la procédure Page_Load :

if (!IsPostBack)
{
     captchaText = generateCaptchaCode(5);
     this.Session["captchaCode"] = captchaText;
     imgCaptchaImage.ImageUrl = "data:image/png;base64," +Convert.ToBase64String(generateCaptchaImage());
}

Ajout de ces deux procédures dans la page :

private string generateCaptchaCode(int charCount)
     Random r = new Random();
     string s = "";
     for (int i = 0; i < charCount; i++)
     {
          int a = r.Next(3);
          int chr;
          switch (a)
         {
              case 0:
                   chr = r.Next(0, 9);
                   s = s + chr.ToString(); 
                   break;
              case 1:
                   chr = r.Next(65, 90);
                   s = s + Convert.ToChar(chr).ToString();
                   break;
              case 2:
                   chr = r.Next(97, 122);
                   s = s + Convert.ToChar(chr).ToString();
                   break;
         }
     }
     return s;
}

private byte[] generateCaptchaImage()
{
     Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format32bppArgb);
     Graphics g = Graphics.FromImage(bitmap);
     Rectangle rect = new Rectangle(0, 0, width, height);
     HatchBrush hatchBrush = new HatchBrush(HatchStyle.DottedGrid, System.Drawing.ColorTranslator.FromHtml("#E6EB52"), System.Drawing.ColorTranslator.FromHtml("#E6EB52"));
     g.FillRectangle(hatchBrush, rect);
     
     hatchBrush = new HatchBrush(HatchStyle.Divot, System.Drawing.ColorTranslator.FromHtml("#A6AB32"), System.Drawing.ColorTranslator.FromHtml("#7490A0"));
     for (int i = 0; i < (int)(rect.Width * rect.Height / 50F); i++)
    {
          int x = rnd.Next(width);
          int y = rnd.Next(height);
          int w = rnd.Next(10);
          int h = rnd.Next(10);
          g.FillEllipse(hatchBrush, x, y, w, h);
     } 

     GraphicsPath graphicPath = new GraphicsPath(); 
     graphicPath.AddString(captchaText, FontFamily.GenericMonospace, (int)FontStyle.Bold, 40, rect, null); 
     hatchBrush = new HatchBrush(HatchStyle.Divot, System.Drawing.ColorTranslator.FromHtml("#000000"), System.Drawing.ColorTranslator.FromHtml("#446090")); 
     g.FillPath(hatchBrush, graphicPath); 
     hatchBrush.Dispose();
     g.Dispose();
     System.IO.MemoryStream ms = new System.IO.MemoryStream();
     bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
     byte[] byteImage = ms.ToArray();
     return byteImage;
}

Évènement de l'appui sur le bouton Envoyer :

protected void envoyer_Click(object sender, EventArgs e)
{
     if (txtCaptchaCode.Text == this.Session["captchaCode"].ToString())
     {
          retour.Text = "Votre message a bien été envoyé.";
     }
     else
     {
          string csname1 = "RemarqueScript";
          Type cstype = this.GetType();
          ClientScriptManager cs = Page.ClientScript;
          string cstext1 = "alert(\"Le code n'est pas le bon.\");";
         cs.RegisterStartupScript(cstype, csname1, cstext1, true);
     }
}

Commentaires

Posts les plus consultés de ce blog

Scénario d'une gestion durable de l'humanité imaginée par un informaticien

Comment éviter que deux divisions se chevauchent ?

Le contrat Pfizer passé avec l'Europe le 20/11/2020