Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

Asp.NET’te Güvenlik Kodu Oluşturma

Günümüz sitelerinde, genellikle kayıt esnasında kullanıcıdan gerekli bilgileri almaktan ziyade, son olarak bir resim üzerindeki az çok okunur biçimde olan karakterleri, sistem bizden istemektedir.Eğer doğru biçimde karakterleri girersek kayıt işlemi başarılı olacaktır.Yanlış girersekte bize uyarı verecektir.Bu güvenlik önlemi, siyah şapkalı hackerların kurbanı olmamanız için alınmış bir takım yöntemlerdir.Çünkü, kayıt esnasında bir kaç dakikada veritabanınıza 1.000.000.000 tane kayıt yapabilir ve veritabanınızın boyutunu bir anda şişirebilirler.Ancak güvenlik kodunu okutmak hackerların işini zorlaştıracaktır.
Öncelikle güvenlik kodu nasıl oluşturulur buna değinmeden önce, ben aşağıdaki tasarımı hazırlıyorum.
Yukarıda gördüğünüz gibi bir tasarım hazırladım.Şunu izah etmek istiyorum.Oluşturduğumuz resim, Image nesnesinin ImageUrl özelliğine verilecektir.Ancak ben iki kullanıcı için iki resim, beş kullanıcı için beş resim derken, bin kullanıcı için bin resim oluştururum.Ve buda hosting alanımı çok çabuk bir şekilde şişirecektir.Hostingci bize küfür edecektir :).Her kullanıcı için bir resim oluşturmaktansa, bir .aspx sayfasını Image nesnesinin ImageUrl özelliğine verip, o sayfayı sanki resimmiş gibi göstermek daha maliyetli olacaktır.Bu şekilde, iki,üç,beş,bin veya on bin kişiyede o .aspx sayfası sayesinde, bir tane resim göstermiş olacağız.

Şimdi bahsettiğim .aspx sayfasını oluşturmadan önce, güvenlik kodunu üreten classımızı yazalım.Ben GuvenlikKoduUretici.cs adında bir sınıf hazırlıyorum.

---GuvenlikKoduUretici.cs---
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Threading;
using System.Drawing;

public class GuvenlikKoduUretici
{
    private int KarakterSayisi;
    //Güvenlik kodunda kaç karakter bulunacaksa, bu field sayesinde belirleyeceğiz.
    private string FontTipi;
    //Güvenlik kodundaki karakterlerin Fontunu bu field tutacak.
    private float FontBoyutu;
    //Guvenlik kodundaki karakterlerin Font Size ını bu field tutacak.
    private string OlusturulanString;
    //En son oluşturulan karakterlerin metinsel halini bu field tutacaktır.

    public string OlusturulanStringVer
    {
        get
        {
            return OlusturulanString;
        }
    }

    public void GuvenlikKoduOzellikleri(int KarakterSayisi, string FontTipi, float FontBoyutu)
    {
        this.KarakterSayisi = KarakterSayisi;
        this.FontTipi = FontTipi;
        this.FontBoyutu = FontBoyutu;
    }
    //Bu metod sayesinde güvenlik kodunun özelliklerini dışardan set edeceğiz
    private char KarakterUret()
    {
        Random rastgele = new Random();
        char karakter = ' ';
        bool kontrol = true;

        while (kontrol)
        {
            int sayi = rastgele.Next(65, 123);
            if (!(sayi > 90 && sayi < 97))
            {
                karakter = (char)sayi;
                kontrol = false;
            }
        }
        return karakter;
    }
    /*
     Bu method sayesinde karakterler üretilecektir.
     Eğer int değerler char tipine dönüştürülürse , ASCII kod karşılığına denk düşen karaktere ulaşılır.
     ASCII kod aralığı 65 - 90 olanlar büyük harfleri temsil ederken, 97 - 122 olanlar küçük harfleri temsil eder.
     */
    private string KarakterDizisiOlustur()
    {
        string karakterdizisi = "";
        for (int i = 0; i < this.KarakterSayisi; i++)
        {
            karakterdizisi += KarakterUret().ToString();
            Thread.Sleep(10);
            //Thread.Sleep() metodu ise, bir işlemi milisaniye cinsinden geciktirmeye yarar.
            //Burada karakter üretmeyi 10 ms. geciktirdik.
            //Thread sınıfını kullanabilmek için, System.Threading namespace ini using etmeniz gerekmektedir.
        }
        return karakterdizisi;
    }
    public Bitmap GuvenlikResmi()
    {
        string resmebasilacakifade = KarakterDizisiOlustur();
        this.OlusturulanString = resmebasilacakifade;
        //Burada Graphics sınıfını kullanacağımız için System.Drawing namespace ini using etmelisiniz.
        Bitmap b = new Bitmap(10, 10);
        //Aşağıda Graphics tipinden grafik ismindeki referansımıza Graphics.FromImage() metodunu bağlarken, bizden Bitmap nesnesi istemektedir.İşte bu b adındaki Bitmap nesnesini bu sebepten dolayı oluşturuyoruz.
        Graphics taban = Graphics.FromImage(b);
        //Graphics sınıfı sayesinde çizim işlemlerini gerçekleştirebiliyoruz.Graphics nesnesi oluştururken, constructorına bir tane Bitmap nesnesi istemektedir.Yukarıdaki b ismindeki Bitmap nesnesini bu yüzden oluşturduk.FromImage() metodu sayesinde grafik tabanı oluşturmuş bulunuyoruz.Bitmap nesnesine verilen boyutlar, bu oluşturulan grafiği etkileyecekmi diye sorarsanız, hayır etkilemeyecektir.Bitmap nesnesi sadece grafik oluşturulması için formaliteden yaratılmıştır.
        //Şimdi ise oluşturduğumuz grafik tabanına bir Bitmap nesnesiyle, resmini çizeceğimiz string ifadenin hangi özelliklere göre çizileceği bilgisini verelim.
        Bitmap resim = new Bitmap((int)taban.MeasureString(resmebasilacakifade, new Font(this.FontTipi, this.FontBoyutu)).Width, (int)taban.MeasureString(resmebasilacakifade, new Font(this.FontTipi, this.FontBoyutu)).Height);
        //MeasureString() metoduyla, otomatik boyutlarda resim oluşturuyoruz.resmebasilacakifade değişkeninin uzunluğuna göre boyut oluşturulmaktadır.
        //Şimdi elimizdeki bu Bitmap nesnesini Graphics'e çizdirelim.
        Graphics resimciz = Graphics.FromImage(resim);
        //resim Bitmap'i boyutlarında bir resimciz nesnesi olusturuldu.
        resimciz.DrawString(resmebasilacakifade, new Font(this.FontTipi, this.FontBoyutu), Brushes.GreenYellow, new PointF(0, 0));
        //resimciz nesnesi üzerine resmebasilacakifade'sindeki ifadeyi,FontTipi ve FontBoyutu Fontlarında,Brushes.GreenYellow fırçasıyla, 0'a 0'dan başlayarak çiz.
        return resim;
    }
}

Artık GuvenlikKoduUretici.cs sınıfını oluşturduktan sonra, bu sınıfın oluşturacağı resmi yedireceğimiz .aspx sayfasınıda oluşturalım.
GuvenlikResmi.aspx sayfasında oluşturuyorum.

---GuvenlikResmi.aspx---
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Drawing;
using System.Drawing.Imaging;

public partial class GuvenlikResmi : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //Bu web sayfası normal bir web sayfası olmayacaktır.
        //İçine resim gömülmüş ve o resim formatında çıktı verebilen bir sayfa olacaktır.
        //Artık bir resim dosyası gibi davranacaktır.
        GuvenlikKoduUretici guvenlik = new GuvenlikKoduUretici();
        guvenlik.GuvenlikKoduOzellikleri(5, "Arial", 10f);
        Bitmap resim = guvenlik.GuvenlikResmi();
        Response.ContentType = "image/jpeg";
        //ContentType özelliği, bu sayfanın aslında ne olduğunu belirten özelliktir.Bu sayfanın streaminde(yapısında) ne olacağını bildirir.Default olarak bir .aspx sayfasının ContentType'ı text/html dir.Dilersek xml'e, dilersek zip dosyasına çevirebiliriz.(text/xml v.s.)
        resim.Save(Response.OutputStream, ImageFormat.Jpeg);
        //Bu sayfanın OutputStream'ına resim nesnesini Jpeg formatında göm.
    }
}

Son olarak Image nesnemizin ImageUrl özelliğine GuvenlikResmi.aspx sayfasını göstermemiz yetecektir.
Sayfalarımızı derleyip çalıştırdığımız zaman, aşağıdaki görüntüyü elde etmemiz gerekiyor 🙂

Gördüğünüz gibi güvenlik kodumuz oluşmuştur.Sayfayı her yenilediğinizde değişmesi gerekmektedir.Kod kontrol kısmını da Session nesnelerini kullanarak yapabiliriz.Tabi bu kısmıda sizlere bırakıyorumŞimdilik bu kadar.

İyi çalışmalar..

Bunlar da hoşunuza gidebilir...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*