Güvenlik kodu (captcha), web sitelerimizi saldırılardan korumak için kullandığımız, basit olduğu kadar kullanışlı bir güvenlik önlemidir. Bu yazımda Asp.Net teknolojisi ve C# dilini kullanarak basit bir güvenlik kodu oluşturma ve bu kodun doğrulanması işlemini uygulamaya dökeceğiz.

Güvenlik Kodu (Captcha) Kullanmam Gerekli mi?
Güvenlik kodları web sitelerin form doldurma işlemleri sırasında kullanılır. En fazla siteye üyelik, iletişim formu ile mesaj gönderme, sistemlere birden fazla yanlış şifre girme gibi durumlarda tercih edilir.

Eğer bu güvenlik önlemi olmasaydı;

• Web sitelerin iletişim bölümlerine botlar aracılığıyla yüzlerce mesaj göndermek mümkün olurdu.
• Kullanıcı girişi gerektiren sistemlere brute force saldırıları düzenlenerek şifreler kolaylıkla bulunabilirdi.
• Veritabanlarına yüzlerce sorgu gönderilerek sistemlerin devre dışı kalması sağlanabilirdi.



Örneğimiz şu şekilde çalışacak; Öncelikle 29 harf ve 10 adet rakamdan oluşan dizi içerisinden rastgele 5 adet karakter alınacak. Bu 5 adet karakterden oluşacak veriye erişimin dışarıdan engellenmesi için bir Sessiona aktarılacak. Ziyaretçiye ise bu veri bir resim dosyası şeklinde gösterilerek, girdiği değer ile Session içerisindeki veri karşılaştırılacak. Aşağıdaki gibi bir tasarım yaparak işe başlayalım.

Asp.Net formunu aşağıdaki kodları kullanarak oluşturabilirsiniz.

HTML-Kodu:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title></title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

        Güvenlik Kodu:<asp:Image ID="imgKod" runat="server" />

        <br />

        <br />

        Güvenlik Kodunu Girin:<asp:TextBox ID="txtKontrolKodu" runat="server"></asp:TextBox>

        <br />

        <br />

        <asp:Button ID="btnKontrol" runat="server" Text="Kontrol" />

        <br />

        <br />

        <asp:Label ID="lblMesaj" runat="server" Text="Label"></asp:Label>

    </div>

    </form>

</body>
 </html>

Programın C# kodlarını da aşağıdan inceleyebilirsiniz. Gerekli açıklamaları kodların arasına ekledim.

Kod:
HTML-Kodu:
protected v0id Page_Load(object sender, EventArgs e)

    {

        //İlk yüklemede doğrulama kodunu oluşturur.

        if (!Page.IsPostBack)

        {

            ResimOlustur();

        }

    }

    public v0id ResimOlustur()

    {

        string kod = "";

        kod = RastgeleVeriUret();

        //Üretilen kodu Session nesnesine aktarır.

        Session.Add("kod", kod);

        //Rastgele üretilen metini alıp resme dönüştürelim.

        //boş bir resim dosyası oluştur.

        Bitmap bmp = new Bitmap(100, 21);

        //Graphics sınıfı ile resmin kontrolunu alır.

        Graphics g = Graphics.FromImage(bmp);

        //DrawString 20‘ye 0 kordinatına kodu‘u yazdırır.

        g.DrawString(kod, new Font("Comic Sanns MS", 15), new SolidBrush(Color.Black), 20, 0);

        //Resmi binary olarak alıp sayfaya yazdırmak ıcın MemoryStream kullandık.

        MemoryStream ms = new MemoryStream();

        bmp.Save(ms, ImageFormat.Png);

        var base64Data = Convert.ToBase64String(ms.ToArray());

        imgKod.ImageUrl = "data:image/png;base64," + base64Data;

        g.Dispose();

        bmp.Dispose();

        ms.Close();

        ms.Dispose();

    }

    public string RastgeleVeriUret()

    {

        string deger="";

        //Türkçe karakterleri kullanmaktan vazgeçtim.

        string dizi = "ABCDEFGHIJKLMNOPRSTUVYZ0123456789";

        Random r = new Random();

        //Toplam 6 karakterden oluşan rastgele bir metin oluşturalım.

        for (int i = 0; i < 5;i++ )

        {

            deger = deger + dizi[r.Next(0, 33)];

        }

        return deger;

    }

    protected v0id btnKontrol_Click(object sender, EventArgs e)

    {

        //Bu kısımda da Session'daki değer ile kullanıcının resimde görerek girdiği kod karşılaştırılır.

        if (txtKontrolKodu.Text == Session["kod"].ToString())

        {

            //Doğrulama kodu doğruysa çalıştırılacak kodlar

            lblMesaj.Text = "Doğrulama Sağlandı!";

        }

        else

        {

            //Doğrulama kodu yanlışsa çalıştırılacak kodlar

            lblMesaj.Text = "Doğrulama Kodu Yanlış!";

            //Kullanıcının girdiği kod yanlışsa yeni bir resim ve session oluşturulur.

            ResimOlustur();

        }

    }
Yukarıdaki kodlarda v0id yazan yerlerde 0 sayısını o harfi ile değiştirin




aLinti..