Merhabalar,
Ben yaptığım projelerde iletişim formlarından spam mesaj gelmemesi için Google reCAPTCHA v2 kullanıyordum. "Ben robot değilim" onay kutusu kullanıcılar için ne kadar can sıkıcı olsa da botları engelliyordu.
Bu fikrim ta ki çalıştığım şirkette en son yaptığım projeye eklediğim iletişim formundan spam mesajları yağana kadardı.
Bu sefer "Ben robot değilim" onay kutusu yerine siteye giren kullanıcıların davranışlarını inceleyerek 0 ile 1 arasında puanlandırma yapan Google reCAPTCHA v3'ü denemeye karar verdim.
Bu yazımda size sitemize nasıl ekleyeceğimizi anlatacağım.
(Google reCAPTCHA admin'den ekleyeceğiniz site için reCAPTCHA v3 oluşturduğunuzu varsayarak devam ediyorum)
JS Kodları:
<script src='https://www.google.com/recaptcha/api.js?render=[Google reCAPTCHA'nın verdiği site key]'></script>
<script>
grecaptcha.ready(function () {
grecaptcha.execute('[Google reCAPTCHA'nın verdiği site key]', { action: 'Yönlenecek Action İsmi' }).then(function (token) {
$("#GoogleCaptchaToken").val(token);
});
});
</script>
Form classımız:
public class Form
{
public string Adsoyad { get; set; }
public string Email { get; set; }
public string Konu { get; set; }
public string MesajMetni { get; set; }
public string GoogleCaptchaToken { get; set; }
}
Formunuza eklemeniz gereken gizli input:
@Html.HiddenFor(m=>m.GoogleCaptchaToken)
Şimdi sıra kullanıcı formu yolladıktan sonra, Google'ın kullanıcıya verdiği puanı kontrol etmemize geldi. Eğer kullanıcının aldığı puan 0'a yakınsa bot (spam), 1 e yakınsa normal kullanıcı olduğunu varsayacağız:
public ActionResult Contact()
{
return View();
}
[HttpPost]
public async Task<ActionResult> Contact(Form mesaj)
{
if (ModelState.IsValid)
{
var isCaptchaValid = await IsCaptchaValid(mesaj.GoogleCaptchaToken);
if (!isCaptchaValid)
//Eğer kullanıcının puanı 0'a yakınsa yani bot olduğu düşünülüyorsa yapılacak olan işlem
else
//Kullanıcının puanı 1'e yakınsa, normal kullanıcı olduğu düşünülüyorsa yapılacak işlem
}
return View();
}
Google'dan gelen cevapları alıp doğrulamasını sağlayan aşağıdaki kodu ve classı da controller dosyamıza ekleyelim:
private async Task<bool> IsCaptchaValid(string response)
{
try
{
var secret = "6LduX8kUAAAAABOSm7H6_LK8rqH_LniaMODIJYAb";
using (var client = new HttpClient())
{
var values = new Dictionary<string, string>
{
{"secret", secret},
{"response", response},
{"remoteip", Request.UserHostAddress}
};
var content = new FormUrlEncodedContent(values);
var verify = await client.PostAsync("https://www.google.com/recaptcha/api/siteverify", content);
var captchaResponseJson = await verify.Content.ReadAsStringAsync();
var captchaResult = JsonConvert.DeserializeObject<CaptchaResponseViewModel>(captchaResponseJson);
return captchaResult.Success
&& captchaResult.Action == "Yönlenecek Action İsmi"
&& captchaResult.Score > 0.5;
}
}
catch (Exception ex)
{
return false;
}
}
public class CaptchaResponseViewModel
{
public bool Success { get; set; }[JsonProperty(PropertyName = "error-codes")]
public IEnumerable<string> ErrorCodes { get; set; }[JsonProperty(PropertyName = "challenge_ts")]
public DateTime ChallengeTime { get; set; }public string HostName { get; set; }
public double Score { get; set; }
public string Action { get; set; }
}