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

The vaccine is not the right technology

Le vaccin n’est pas la bonne technologie

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