Osman KURT

Kendime Not

MVC'de Captcha Kullanımı

Yakın bir tanıdığımın işine yaracağı için üzerinde çalıştığım bir örnek, basit ama hayat kurtarır. Günümüz teknolojisnin insan hayatında bazen bıkkınlık verir derecesine rahatsızlık verdiğinin farkındayız.

Bunlarda yazılan otomatik sistemlerin payı büyük. Yazılım tekniklerinin gelişmesi ile suistimal oranlarıda arttı haliyle.

Nasıl mı?

Reklam amaçı yazılan botlar gibi.
İşte bunları engellemenin  en önemli faktörlerinden bir tanesi Captcha kullanımı. Yani karşımızda ki kullanıcının insan olduğunu anlamak.

Onu da nasıl yapıyoruz bakalım şimdi.
Oluşturduğumuz bir projenin HomeController kısmına şu kodu yazıyoruz;

public ActionResult CaptchaImage(string prefix, bool noisy = true)
       {
            int i, r, x, y;
            var rand = new Random((int)DateTime.Now.Ticks);
            int a = rand.Next(10, 99);
            int b = rand.Next(0, 9);
            var captcha = string.Format("{0} + {1} = ?", a, b);
            Session["Captcha"] = a + b;
            FileContentResult img = null;
            using (var mem = new MemoryStream())
            using (var bmp = new Bitmap(130, 30))
            using (var gfx = Graphics.FromImage((Image)bmp))
            {
                gfx.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
                gfx.SmoothingMode = SmoothingMode.AntiAlias;
                gfx.FillRectangle(Brushes.White, new Rectangle(0, 0, bmp.Width, bmp.Height));
                if (noisy)
                {
                    var pen = new Pen(Color.Yellow);
                    for (i = 1; i < 10; i++)
                    {
                        pen.Color = Color.FromArgb((rand.Next(0, 255)),(rand.Next(0, 255)),(rand.Next(0, 255)));
                        r = rand.Next(0, (130 / 3));
                        x = rand.Next(0, 130);
                        y = rand.Next(0, 30);
                    }
                }
                gfx.DrawString(captcha, new Font("Tahoma", 15), Brushes.Gray, 2, 3);
                bmp.Save(mem, System.Drawing.Imaging.ImageFormat.Jpeg);
                img = this.File(mem.GetBuffer(), "image/Jpeg");
            }
            return img;
        }

Daha sonra ön tarafa geçiyoruz ve kullanıcılarımıza göstereceğimiz resim parçasını ayarlıyoruz. Bunun için de alt kısımda ki kod bloğunu kullanıyoruz.

<script>
    function GetCaptcha() {
        $("#rsm").attr('src', '/Home/CaptchaImage?' + new Date().getTime());
   }
</script>
<img src="@Url.Action("CaptchaImage")" id="rsm" style="" />
<input type="button" value="Yenile" onclick=" return GetCaptcha()" />

Post ettiğimiz zaman doğruluk kontrolünü,
if (Session["Captcha"] == null || Session["Captcha"].ToString() != model.Captcha)
{
     //hata mesajı
     return View(model);
}

Session da tuttuğumuz captcha verisi ile kullanıcının girdiği veriyi karşılaştırıyoruz ve kontrolümüzü sağlıyoruz.

Görüşmek üzere
Osman KURT
Yazılım Uzmanı & MVC Eğitmeni