CAPTCHA Nedir ve Nasıl Yapılır?

Photo by Rock'n Roll Monkey on Unsplash

CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart), temel olarak bir girdinin insan mı yoksa makinelerce mi sağlandığını anlamaya yönelik bir mekanizmadır.

Çoğunlukla web sitelerinde güvenlik veya spam’leri önlemek amacıyla kullanılan, sayfada doldurduğuz formun sonunda “Resimdeki karakterleri aşağıdaki kutucuğa yazın” veya “Robot olmadığınızı kanıtlayın” gibi bir takım sorularla karşılaşırız. Bu soruların amacı, “bot” diye adlandırılan belli bir yapay zekaya sahip kötü amaçlı bilgisayar yazılımlarını elimine etmektir. PHP ile böyle bir mekanizmayı nasıl yapacağımızı anlatmadan önce, bazı önemli noktalara dikkatinizi çekmek istiyorum, çünkü burada yapay zekadan bahsediyoruz..

Birkaç yıl önce geliştiricisi olduğum ve eğitime yönelik bir portal vardı. Üyelik o kadar kolaydı ki sadece isim, soyisim, e-posta ve şifre girerek üye olabiliyor ve sistemi anında kullanmaya başlayabiliyordunuz. Konu eğitim olunca ilkokul çağında dahi üyelerimiz olduğundan e-posta aktivasyonu gibi bir mekanizma koymak istememiştik kolaylık açısından. Sistem Whatsapp ‘taki gibi kapalı grup mantığında işliyordu ve hiçbir güvenlik açığımız da yoktu. Saldırganın biri tahminimce başka bir açık bulamamasından dolayı(!) olsa gerek tamamen rastgele isim ve e-posta bilgileriyle her gün yüzlerce yeni üyelik kaydı açmaya başladı ve kayıt tarihleri arasındaki farklara baktığımızda bunun bir yazılım tarafından belli periyodlarla yapıldığı belliydi.

Biz de önlem olarak CAPTCHA ‘yı devreye alalım dedik. Önce PHP ile detaylarını daha sonra paylaşağım bir mekanizma ile dinamik bir resim oluşturdum ve tahmin edeceğiniz üzere resimde rastgele bir takım karakterler yazıyordu. Bir kaç gün saldırganı engellemiş gibi gözüksek de kullanılan yazılım bunu atlatmayı başardı. “Nasıl olur?” diye araştırırken,

resmin kontrast ve ışığıyla oynayarak sadece karakterlerin ön plana çıkartılması ve tanınması yönteminin kullanıldığını keşfettim.

Photo by Philippe Leone on Unsplash

Sonra Google ‘ın hepimizin bildiği “Ben Robot Değilim” mekanizmasını devreye aldım. Kendi kendime “Bunu da aşsın da göreyim” dedim. Yine bir kaç günlük aradan sonra sevgili saldırganımız tüm gücünü toplamış ve bize oyunlardaki gibi “süper” çekmişti: Hala kayıt atabiliyordu! Resmen beynim durdu, “Google’ı bile aşabiliyorsa ben ne yapabilirim” dedim ama bu arada çözüm arayışına devam ettim. Sonra sırf merakımdan nasıl oluyorda Google’ın bu mekanizması atlatılabiliyor diye uzun uzun araştırdım ve çok acayip bir bilgiye rastladım: Google, kullanıcının sayfadaki fare hareketlerini bir script ile takip ediyor ve kullanıcı “ben robot değilim” ‘e tıkladığında bu fare hareketlerine göre belli bir algoritmayla hesaplanmış bir değerin sonucunda bir takım resimler soruyordu. Bu da şu demek oluyor:

Aynı fare hareketine aynı resmi soruyor!

Anlaşılan o ki saldırganımız yaptığı hareketleri bilgisayara bir şekilde kayıt altına aldırmış (bunu yapan bir çok yazılım mevcut) ve aynı harekete hep aynı resim sorusunu alarak yine tıklama olaylarını da kayıt altına aldığından kendisinin simülasyonunu makineye yaptırabilmiş ve Google ‘ı atlatmıştı! Bu açık 3 yıl önce geçerliydi, hala geçerliliğini koruyor mu bilmiyorum ama Google algoritmayı değiştirmiştir diye tahmin ediyorum.

Hal böyleyken Google ‘ı kullanmaktan vazgeçip yine kendi çözümlerimi aramaya koyuldum ve sonunda aşağıdaki görseldeki gibi bir CAPTCHA ile saldırganı durdurmayı başardım:

PHP ile oluşturulan ve saldırganın atlatamadığı CAPTCHA Örneği

Saldırgan bot neden bu önlemi atlatamadı? Çünkü görsel, sorduğum karakterler haricinde başka karakterler içeren bir arkaplana sahipti. Kontrast ve ışıkla ne kadar oynarsanız oynayın arkaplandaki sahte karakterler yok olmuyordu, dolayısıyla çok akıllı botlar karakterleri tespit ederken bu sahte karakterleri de tespit ediyordu ve yanlış bir sonuca varıyordu.

Photo by J E W E L M I T CH E L L on Unsplash

Peki Nasıl Çalışıyor Bu CAPTCHA?

Yazının devamında paylaştığım örnek kodlarda da göreceğiniz üzere mantık çok basit: Arayüzde bir img etiketi (veya görseli yüklemek için kullanacağınız herhangi bir yöntem) ile görselin yükleneceği adres olarak CAPTCHA görseli üreten sayfayı çağırıyoruz. Çağırdığımızda yükleme alanına rastgele oluşturulmuş bir görsel dönüyor fakat dönmeden önce içeriğindeki karakterler session ‘da tutuluyor. Daha sonra yapılacak herhangi bir istekte kontrol amaçlı olarak bu session ‘da tutulan değeri kontrol ediyoruz, doğruysa ilgili diğer kontrollerimize ya da her ne yapmak istiyorsak rutin işlerimize geçiyoruz.

Benzer yöntemi herhangi bir yazılım dilinde uygulayabilirsiniz.

CAPTCHA Test Sayfası
CAPTCHA Oluşturan Kütüphane

Tam örnek için GitHub ’daki projemden faydalanabilirsiniz:

İstanbul‘da bir Yazılım ve Teknoloji Ar-Ge Mühendisi. Ürün, yazılım, sistem analisti ve tasarımcısı. http://www.zaferaltun.com/

İstanbul‘da bir Yazılım ve Teknoloji Ar-Ge Mühendisi. Ürün, yazılım, sistem analisti ve tasarımcısı. http://www.zaferaltun.com/