Asp.net Güvenlik Kodu (Captcha) Oluşturma ve Doğrulama (Validation)

5CE5D49B380ABFC146FC4E1A3DAB3BD0

Asp.Net örneklerimize uzun bir aradan sonra güvenlik resmi veya güvenlik kodu (Captcha) oluşturma ve bu kodun doğrulama kontrolleri (Validation) test edilmesini inceleyeceğiz.
guvenlikresmi
Güvenlik kodu nedir kullanmasak olur mu? yada neden güvenlik kodu kullanıyoruz diyorsanız, bir iletişim sayfası,üye sayfası veya kullanıcıların dışarıdan bilgi girişi yapıp işlem gerçekleştirdiği bir sayfanız var ise belli bir zaman sonra veri tabanınız veya siteniz ne idüğü belirsiz (ne olduğu,kim olduğu,nerden geldiği belli olmayan) mesajlar,üyeler,işlemler yüzünden şişebilir bunu engellemek için formları bir botun doldurmadığından emin olmak için alınabilecek bir önlemdir.

Bu kısa bilgiden sonra Asp.net ile Güvenlik Kodu (Captcha) Oluşturma ve Doğrulama (Validation) işlemi nasıl yapılacak hemen bakalım..
1-Güvenlik resmi üreten bir fonksiyon hazırlayacağız
2-Bu fonksiyonu güvenlik resminin yenilenmesini istediğimiz durumlarda çalıştıracağız

Fonksiyonumuz..:

private void Guvenlik(int H, int W, string fonts, int Punto, int X, int Y, string arkaplanResmi)
    {
        Bitmap bmp = new Bitmap(H, W);
        Graphics g = Graphics.FromImage(bmp);
        Font font = new Font(fonts, Punto);
        Random r = new Random();
        int sayi = r.Next(1000, 99999);
        ViewState["captcha"] = sayi;
        System.Drawing.Image img = System.Drawing.Image.FromFile(arkaplanResmi);
        g.DrawImage(img, 1, 1);
        g.DrawString(sayi.ToString(), font, Brushes.DarkRed, X, Y);
        g.CompositingQuality = CompositingQuality.HighQuality;
        bmp.Save(Server.MapPath("images/captcha.png"), ImageFormat.Png);
    }

Kodlarımızın doğru çalışabilmesi için
using System.Drawing;
using System.Drawing.Design;
using System.Drawing.Text;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging; namesapacelerinin sayfamıza eklenmeyi unutmuyoruz..

Yaptığı işlem 1000-99999 arasında rastgele bir sayı üretip bu sayıyı ViewState’de captcha isimli bir değişkende tutuyor ve aynı sayıyı kullanıcıya göstermek içinde belirlediğiniz arkaplanresminin üzerine çiziyor(dikkat yazıyor demedim çiziyor çünkü resim üzerinde işlem yaparken dikkat ederseniz System.Drawing namespacesini kullanıyoruz.)

Şimdi fonksiyonumuz hazır bunu nasıl kullanacağız peki derseniz..

 protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            Guvenlik(100, 40, "Tahoma", 14, 20, 10, Server.MapPath("images/arkaplan.png"));
        }
    }

ve güvenlik resmini ekranda gösterebilmek için

 <img src="images/captcha.png" alt="sayi" title="sayi" />

kullanıyoruz..

ve son olarak doğrulama işlemi sayfaya bir CustomValidator ekleyip OnServerValidate özelliğini sayikontrol olarak değiştiriyoruz. kodların tamamı ve projenin çalışan hali aşağıda..
arkaplan
resmini images klasörü içine atmayı unutmayalım bu oluşacak olan güvenlik resmi için arka plan olacak veya siz kendiniz bir resim belirleyip images klasörü içine atabilirsiniz.

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>www.aspnetornekleri.com</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
     <img src="images/captcha.png" alt="sayi" title="sayi" />
        <br />
        <asp:TextBox ID="TextBox1" runat="server" Width="100px"></asp:TextBox>
    &nbsp;<br />
        <asp:CustomValidator ID="CustomValidator1" runat="server"
                ErrorMessage="Doğrulama Kodu Yanlış" ControlToValidate="TextBox1" OnServerValidate="sayikontrol"></asp:CustomValidator>
        <br />
        <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server"
            ControlToValidate="TextBox1" ErrorMessage="Doğrulama Kodunu Girin"></asp:RequiredFieldValidator>
        <br />
        <asp:Button ID="Button1" runat="server" Text="Kontrol"
            onclick="Button1_Click" />
        <br />
        <asp:Label ID="Label1" runat="server"></asp:Label>
    </div>
    </form>
</body>
</html>

 

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            Guvenlik(100, 40, "Tahoma", 14, 20, 10, Server.MapPath("images/arkaplan.png"));
        }
    }
    private void Guvenlik(int H, int W, string fonts, int Punto, int X, int Y, string arkaplanResmi)
    {
        Bitmap bmp = new Bitmap(H, W);
        Graphics g = Graphics.FromImage(bmp);
        Font font = new Font(fonts, Punto);
        Random r = new Random();
        int sayi = r.Next(1000, 99999);
        ViewState["captcha"] = sayi;
        System.Drawing.Image img = System.Drawing.Image.FromFile(arkaplanResmi);
        g.DrawImage(img, 1, 1);
        g.DrawString(sayi.ToString(), font, Brushes.DarkRed, X, Y);
        g.CompositingQuality = CompositingQuality.HighQuality;
        bmp.Save(Server.MapPath("images/captcha.png"), ImageFormat.Png);
    }
    protected void sayikontrol(object source, ServerValidateEventArgs args)
    {
        if (ViewState["captcha"] != null)
        {
            if (TextBox1.Text != ViewState["captcha"].ToString())
            {
                Guvenlik(100, 40, "Tahoma", 14, 20, 10, Server.MapPath("images/arkaplan.png"));
                args.IsValid = false;
                return;/* www.Aspnetornekleri.com */
            }
        }
        else
        {
            Guvenlik(100, 40, "Tahoma", 14, 20, 10, Server.MapPath("images/arkaplan.png"));
            args.IsValid = false;
            return;
        }

    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        if (!Page.IsValid)
        {
            return;

        }
        Label1.Text = "Güvenlik Kodu Doğru...";
        Guvenlik(100, 40, "Tahoma", 14, 20, 10, Server.MapPath("images/arkaplan.png"));

    }
  • emre çabuk

    sorunla karşılaştım.
    bmp.Save(Server.MapPath(“~/images/captcha.png”), ImageFormat.Png);
    bölümünde verdiği hata:
    An exception of type ‘System.Runtime.InteropServices.ExternalException’ occurred in System.Drawing.dll but was not handled in user code

    Additional information: GDI+ içinde genel bir hata oluştu.

  • http://www.extrayazilim.com Yusuf ŞİMŞEK

    Paylaşım için teşekkürler

    • BilisimOgretmeni

      rica ederim iyi çalışmalar kolay gelsin

  • Engin T

    teşekkür ederim ontextchanged=”TextBox1_TextChanged” kısmı hata veriyordu onu kaldırınca çalışmaya başladı elinize sağlık

    • BilisimOgretmeni

      rica ederiz iyi çalışmalar

  • yılmaz

    calısmıyor

    • BilisimOgretmeni

      oluşan hatayı söylerseniz yardımcı olmaya çalışırım

      • yasar

        kardeşim hepsini yapıyorum kodu giriorum resimlide ama gelmiyor neden ?

  • Cem

    Emeğine sağlık çok işime yaradı sitemde kullanıcam

    • BilisimOgretmeni

      rica ederim işinize yaradı ise ne mutlu iyi çalışmalar