Invisible (Görünmez) reCAPTCHA Kullanımı - Kasım Feke

Merhaba arkadaşlar

Bu yazıda Google’ın son olarak geliştirdiği invisible (görünmez) reCAPTCHA’nın Php’de kullanımından bahsetmeye çalışacağım. reCAPTCHA haricinde neredeyse tüm captcha türleri tamamen başarılı bir şekilde bypass edilebilmektedir (mantıksal captcha dahil değil) yani atlatılabilmektedir. Bundan dolayı öncelikli olarak yorum alanları, üyelik formları, iletişim formları, anketler, üye girişi sayfaları, yönetim paneli giriş sayfaları, abonelik kayıt sayfaları, arama sayfaları ve arama motorları tarafından indexlenmesi istenmeyen sayfalarda brute force (kaba kuvvet) ve spam saldırılarının önlenmesi amacı ile captcha kullanımı güvenlik yönünden önem teşkil etmektedir. reCAPTCHA v2’de işlemler gerçekleştirilirken her seferinde doğrulama istenmektedir lâkin invisible reCAPTCHA’da sadece şüpheli durumlarda captcha doğrulaması gerekmektedir, bu özellik kullanıcıların sıkılmadan web sitenizi veya mobil uygulamanızı kullanmasını sağlamaktadır. Basit bir form üzerinden Invisible reCAPTCHA’nın nasıl kullanıldığını görelim.

 

https://www.google.com/recaptcha adresine girdikten sonra sağ üst tarafta yer alan Get reCAPTCHA butonuna tıklıyoruz.

 

Google hesabımıza giriş yapılması isteniyor, gerekli adımları gerçekleştirerek oturumu açıyoruz.

 

----------------------------------------------------------------------------------------------------------------------------------------------------

Bu sayfada Label kısmına reCAPTCHA’nın kullanılacağı sitenin ismi yazılabilir burası kontrol panelinde sitenin tanıtılması için gerekli olan alandır, istek doğrultusunda farklı şeyler de yazılabilir.

Choose the type of reCAPTCHA da ise kullanılacak olan reCAPTCHA’nın tipi seçilmektedir. Invisible reCAPTCHA’yı işaretliyoruz.

Send alerts to owners işaretlenerek herhangi bir saldırı durumunda haberdar olunması istenebilir.

Domains alanına reCAPTCHA’nın hangi sitelerde kullanılacağı belirtilir, birden çok web sitesinde kullanılmak istenir ise alan adlarının yan yana değil alt alta yazılması gerekmektedir.

Son olarak Accept the reCAPTCHA Terms of Service’i işaretliyoruz hizmet şartlarını kabul ettikten sonra Register butonuna tıklayarak kayıt işlemini gerçekleştirmiş oluyoruz.

 

Kayıt işlemi gerçekleştirildikten sonra karşılaşılan sayfada dikkat edilmesi gereken en önemli yer Keys sekmesidir, burada Site key ile Secret key olmak üzere iki çeşit key (anahtar) vardır bu keyler sayesinde Google’ın reCAPTCHA API’ı ile siteniz arasında şifreli trafik gerçekleşmektedir. Site key formlarda, giriş sayfalarında vs. Secret key ise kullanıcının doğrulanıp doğrulanmadığını kontrol etmek için kullanılmaktadır. Şimdi dosyalarda işlemleri nasıl gerçekleştireceğimizi görelim.

 

Basit bir form oluşturalım önce, form.html veya form.php gibi adlandırabilirsiniz. Php uzantısı ile kayıt edilirse hiç php kodu kullanmadığımız için çalıştırılırken sorun yaşanır mı sorusu aklınıza gelebilir, php olarak kayıt edilen dosyalarda html kodları kullanılmasının sakıncası yoktur ancak html uzantısı ile kayıt edilen dosyalarda php kodlarının kullanılması soruna yol açacaktır.

5. satırda reCAPTCHA’nın api dosyasını çekiyoruz.

6-10. satırlarda güvenlik amacı ile token üretilmektedir. Token, size ait veriler ile erişim yetkilerinin tutulduğu bir yapıdır.

14-22. satırlarda Ad Soyad, Konu ve Mesaj kısımlarının olduğu klasik bir form oluşturulmaktadır.

14. satırda action parametresi ile formun gönderileceği sayfayı belirtiyoruz ve POST metodu kullanarak verilerin URL’de gözükmeden gönderilmesini sağlıyoruz.

21. satırda captcha alanının Google tarafından tanınması amacı ile classı g-recaptcha olarak tanımlanmıştır, daha sonra data-sitekey parametresine Site key yazılır ve data-callbackde yukarıda üretilen token çağırılır form bu şekilde gönderilir.

 

Şimdi de formun gönderileceği ve kullanıcıdan alınan verilerin kontrolünün sağlanacağı kontrol sayfasını hazırlayalım, aslında form dosyası üzerinde de bu işlemi gerçekleştirebilirdik daha anlaşılır olması bakımından bu yöntemi tercih ettim.

2-7. satırlarda post_captcha adında bir fonksiyon oluşturarak user_response değişkenini parametre olarak ekliyoruz ardından bir dizi oluşturarak Secret keyi ve kullanıcının cevabını tanımlıyoruz.

8-10. satırlarda yukarıda tanımlanan dizinin anahtar ve değerlerine ulaşmak için ise foreach döngüsü kullanıyoruz.

Json, api gibi javascript uygulamaları için oluşturulmuş xmlden daha az yer kaplayan bir veri formatıdır.

12-22. satırlarda bir cURL betiği kullanarak reCAPTCHA’dan gelen json yanıtını yakalıyoruz ve yanıtın anlaşılması için decode ederek çözümlüyoruz. cURL bir PHP kütüphanesidir, farklı tiplerdeki sunucu ve protokollerde iletişim yapılmasını sağlar.

24. satırda post_captcha fonksiyonunu çağırıyoruz.

Kalan satırlarda ise reCAPTCHA’nın düzgün çalışmaması hâlinde Keylerin domaininizle eşleştiğinden emin olun, problemsiz şekilde işlem gerçekleştiğinde de BAŞARILI mesajının kullanıcıya gösterilmesini sağlıyoruz.

 

Formumuz bu şekilde. Dikkat edilecek olur ise reCAPTCHA V2’deki gibi Ben robot değilim onay kutusu görünmüyor adından da anlaşılacağı üzere invisible yani görünmez reCAPTCHA’dır yalnız sağ alt köşede reCAPTCHA’nın var olduğunu ve olası bir spam vb. durumda captchanın çıkacağı hakkında bilgi verilmektedir.

          Formu gönderdiğimizde BAŞARILI mesajının döndüğünü görüyoruz.

6 kez üst üste form gönderildiğinde reCAPTCHA çıkmamasına rağmen 7. sefer form gönderilmeye kalkıldığında spam olarak algılandığı için reCAPTCHA ile karşılaşıyoruz.

Kaynak dosyalara https://github.com/kasimfeke/captcha/tree/master/invisible-reCAPTCHA adresinden ulaşabilirsiniz.

Sınırları zorlayan Google’ın reCAPTCHA kullanılan sayfalarda ziyaretçilerin sıkılıp uygulamayı terk etmelerini en aza indirgemeyi amaçladığı ve son olarak kullanıma sunduğu reCAPTCHA türü invisible reCAPTCHA’dan bahsettik. Her ne kadar captcha kullanımı önemsenmese de örneğin giriş sayfalarında reCAPTCHA kullanımı ciddi hacking vakalarının önüne geçmektedir, kullanılmasını şiddetle tavsiye ederim.