Perlindungan formulir dari spam Google reCAPTCHA v3 yang "tidak terlihat" tanpa kehilangan poin PageSpeed ​​Insight

Dari waktu ke waktu ada pertanyaan tentang perlindungan dari bot dalam berbagai bentuk di situs: pendaftaran, otorisasi, berlangganan buletin, umpan balik, komentar, dll.



CAPTCHA standar tidak berguna, bot melewatinya "sekaligus", dan menimbulkan masalah bagi pengguna.



Solusi terbaik adalah menggunakan Google reCAPTCHA v2 atau v3. Kedua versi Google reCAPTCHA adalah opsi yang bagus. Ini adalah yang terbaik yang sekarang tersedia di pasar dari solusi yang jelas dan andal serta gratis.



Masalah utama dengan kedua versi tersebut adalah saat terhubung, skor PageSpeed ​​Insight berkurang secara signifikan sebesar 20-30.



Contoh ReCAPTCHA v2 - membutuhkan gambar menebak



Contoh reCAPTCHA v3 - tidak memerlukan tindakan dari pengguna, menganalisis perilakunya di latar belakang



Poin penting bagi saya bukanlah membuat masalah bagi pengguna nyata, karena Saya sendiri bukan penggemar berat menebak kendaraan di reCAPTCHA v2, jadi pilihan saya adalah v3.



Jadi ada dua masalah Google reCAPTCHA v3 yang perlu ditangani:



  • menggantung logo di pojok kanan bawah;
  • kehilangan 20-30 poin di Google PageSpeed ​​Insight.


Menggantung logo



Google memungkinkan Anda untuk menghapus logo dengan menyembunyikannya melalui CSS dalam perjanjian lisensinya.



.grecaptcha-badge {
	visibility: hidden;
}


Sebaliknya, tulis "Privasi dan Persyaratan Layanan reCAPTCHA anti-spam" di bawah setiap formulir dengan link ke halaman Google yang relevan.





Kehilangan poin di Google PageSpeed ​​Insight



Saat menghubungkan file javascript dari reCAPTCHA v3, skor di Google PageSpeed ​​Insight sangat berkurang. Ini penting bagi saya. Saya pikir ini karena analisis perilaku pengguna (penurunan serupa terjadi saat menggunakan pelindung web di Yandex.Metrica).



Pada sumber daya yang dioptimalkan dengan baik, Anda bisa kehilangan 20-30 poin. Oleh karena itu, Anda dapat menggunakannya di halaman terpisah di mana kecepatan tidak penting (misalnya, kontak) tanpa modifikasi. Untuk digunakan di seluruh situs (misalnya, untuk melindungi formulir login ujung-ke-ujung atau langganan buletin), disarankan untuk membuat modifikasi.



Saya mendapatkan opsi untuk menginisialisasi reCAPTCHA v3 dengan mengklik kolom formulir. Secara default, saya tidak memuat file javascript dari reCAPTCHA v3, dan hanya jika pengguna menempatkan kursor di salah satu kolom formulir, saya akan memuatnya. Kemungkinan besar, metode ini mengurangi keakuratan penentuan pengguna sebenarnya, tetapi tidak ada masalah. Akurasi ini cukup untuk tugas saya.



Dia mulai menggunakan teknik ini pertama kali pada formulir web 1C-Bitrix, kemudian untuk otorisasi ujung ke ujung dan formulir berlangganan di situs tanpa Bitrix.



Mengingat fakta bahwa 1C-Bitrix adalah CMS publik, saya akan memberi tahu Anda secara umum menggunakan contohnya - tentang metodologi dan kemungkinan kasus penggunaan. Lebih banyak fine tuning dapat dilakukan untuk menyesuaikan dengan kebutuhan Anda.



Menggunakan Google reCAPTCHA v3 dalam formulir web 1C-Bitrix



1. Panggil formulir dengan bitrix standar: komponen formulir dan buat 2 tambahan:



  • Ganti tombol type = kirim dengan tombol biasa type = tombol
  • tambahkan nama bidang tersembunyi = g_recaptcha_response






2. Tambahkan inisialisasi reCAPTCHA saat mengklik kolom formulir ke file javascript situs atau komponen (dalam contoh ini, saya berasumsi bahwa Anda menggunakan jQuery):



$('body').on('click','form input, form textarea', function() {
	if (typeof(grecaptcha) == 'undefined') {
		var grecaptcha_s = document.createElement('script');
		grecaptcha_s.src = 'https://www.google.com/recaptcha/api.js?render=<PUBLIC_KEY>';

		var grecaptcha_h = document.getElementsByTagName('script')[0];
	grecaptcha_h.parentNode.insertBefore(grecaptcha_s,grecaptcha_h);
	}
});


3. Tambahkan pelacakan klik pada tombol tombol di formulir. Lebih jauh di dalam, kami menggunakan contoh yang dijelaskan dalam dokumentasi Google. Ini mengisi bidang g_recaptcha_response, yang akan kita gunakan pada langkah terakhir untuk memvalidasi pengguna.



$('body').on('click','form button[name="web_form_submit"]', function() {
	grecaptcha.ready(function() {
		grecaptcha.execute('<PUBLIC_KEY>',{action: 'feedback'}).then(
			function(token) {
				$('form input[name="g_recaptcha_response"]').val(token);

				var form_obj = $('form');
				var event_obj = form_obj.get(0);

				BX.fireEvent(event_obj,'submit');	
				event_obj.submit();
			}
		);
	});
});


4. Melacak peristiwa onBeforeResultAdd di init.php



Sebelum mengirimkan hasil formulir, kami mengajukan banding ke server Google dengan <PRIVATE_KEY> Anda, dan nilai dari bidang g_recaptcha_response tersembunyi dari formulir.



Sebagai tanggapan, kami mendapatkan poin dari pengguna ini:



  • 1 ini pasti seseorang
  • 0 tepatnya robot
  • Lebih dari 0,5 dapat dianggap manusia


AddEventHandler("form","onBeforeResultAdd","onBeforeResultAddHandler");

function onBeforeResultAddHandler($WEB_FORM_ID,$arFields,$arrVALUES)
{
	global $APPLICATION;

	$g_recaptcha_response = $arrVALUES["g_recaptcha_response"];
	if (!empty($g_recaptcha_response))
	{
		$response = json_decode(file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=<PRIVATE_KEY>&response=".$g_recaptcha_response."&remoteip=".$_SERVER["REMOTE_ADDR"]),true);
			

		$g_recaptcha_response_check = false;

		if (($response["success"] and $response["score"] >= 0.5 and $response["action"] == 'feedback']))
		{
			$g_recaptcha_response_check = true;
		}

		if (!$g_recaptcha_response_check)
		{
			$APPLICATION->ThrowException('   Google reCAPTCHA v3.</a>');
		}
	}
	else
	{
		$APPLICATION->ThrowException('   Google reCAPTCHA v3.');
	}
}


Akhirnya



Teknik ini dapat digunakan di situs dan formulir apa pun, apa pun CMSnya. Saya telah memberikan metode kerja umum yang dapat diterapkan dalam proyek Anda.



Anda dapat melakukan hal yang sama dengan Google reCAPTCHA v2, menginisialisasi dengan mengklik formulir dan meminta pengguna untuk mencentang kotak "Saya bukan robot" dan tebak gambar jika perlu. Dalam hal ini, ini juga akan menyimpan poin PageSpeed ​​Insight dan memberikan pengguna alat (pilih gambar) untuk membuktikan bahwa mereka bukan robot. Namun seperti yang saya sampaikan di atas, yang terpenting bagi saya adalah jangan sampai membuat kendala bagi pengguna.



All Articles