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.
Basit bir güvenlik önlemi ile bu tür sorunlardan kurtulmak mümkün. Ayrıca bu tür bir güvenlik kodu ve doğrulama sistemi yapmak için çok fazla kodlama bilgisine de gerek yok. Aşağıdaki örneği konunun anlaşılabilmesi için mümkün olduğunca basit tutmaya çalıştım. Basit değişiklikler ile daha karmaşık bir doğrulama sistemi oluşturabilirsiniz.
Ö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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<%@ 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
protected void Page_Load(object sender, EventArgs e) { //İlk yüklemede doğrulama kodunu oluşturur. if (!Page.IsPostBack) { ResimOlustur(); } } public void 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 void 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(); } } |
Asp.net ile doğrulama kodu oluşturma yazımın sonuna geldim konuyla ilgili sorularınızı bana iletebilirsiniz.
Kodu denedim ama “Expected class, delegate, enum, interface, or struct” hatası veriyor süreklii sebebi ne olabilir? Bir şeyler denedim ama yararı olmadı.
Tamam önceki hataları giderdim ama “The name ‘imgKod’ does not exist in the current context” tarzı 4 hata veriyor.