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"));

    }

You may also like...

Subscribe
Bildir
guest
10 Yorum
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
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

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 ?

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

Yusuf ŞİMŞEK

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

BilisimOgretmeni

rica ederim iyi çalışmalar kolay gelsin

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.

10
0
Yazı hakkındaki yorum, görüş ve önerilerinizi yazınx
()
x