Cara mendeteksi peramban headless dan otomatisasi di halaman pendaftaran
Sinyal peramban yang membongkar pendaftaran lewat Puppeteer, Playwright, dan Selenium, mengapa masing-masing bisa dipalsukan sendiri, dan cara menggabungkannya tanpa memblokir orang sungguhan.
Mengapa bot kini memakai peramban sungguhan
Beberapa tahun lalu, kebanyakan bot pendaftaran adalah skrip HTTP sederhana yang mengirim formulir Anda secara langsung. Bot seperti itu mudah dihentikan: mereka tidak menjalankan JavaScript, sehingga apa pun yang dihitung halaman Anda di peramban tidak pernah sampai. Kini, sebagian besar bot serius mengendalikan peramban sungguhan lewat Puppeteer, Playwright, atau Selenium, sering dalam mode headless, kadang melalui peramban anti-deteksi yang menyamarkan sidik jarinya. Mereka menjalankan JavaScript Anda, merender halaman, dan mengisi formulir seperti manusia.
Mendeteksinya berarti mencari titik-titik di mana peramban otomatis berbeda dari peramban yang dipakai manusia. Tidak satu pun sinyal di bawah ini merupakan bukti dengan sendirinya — operator yang gigih bisa menutupi masing-masing — tetapi sinyal ini murah dikumpulkan dan saling menumpuk.
Sinyal 1: flag WebDriver
Peramban di bawah otomatisasi bergaya WebDriver mengatur navigator.webdriver menjadi true. Ini memang bagian yang disengaja dari standar WebDriver, dan konfigurasi bawaan Selenium, Puppeteer, serta Playwright mengeksposnya.
const automated = navigator.webdriver === true;
Plugin “stealth” menghapus atau menimpanya, jadi ketiadaannya tidak membuktikan apa pun. Namun keberadaannya hampir pasti: pengguna asli praktis tidak pernah memilikinya.
Sinyal 2: user agent headless
Chrome headless menyebut dirinya HeadlessChrome di user agent kecuali operator menimpanya. Periksa juga di server dari header permintaan, karena user agent yang dilaporkan peramban lewat JavaScript bisa berbeda dari yang dikirimnya.
Sinyal 3: klien protokol DevTools terpasang
Puppeteer dan Playwright mengendalikan Chrome melalui protokol DevTools. Saat klien protokol mendengarkan event konsol, mencatat sebuah objek membuat peramban menyerialisasinya — bahkan membaca properti yang tidak pernah disentuh halaman biasa. Getter yang mencatat apakah ia dibaca adalah cara yang dikenal untuk mengetahuinya:
function devtoolsProtocolAttached() { let read = false; const e = new Error(); Object.defineProperty(e, "stack", { get() { read = true; return ""; } }); console.debug(e); return read; }
Ini juga terpicu saat pengembang membuka DevTools, jadi beri bobot sedang alih-alih menjadikannya vonis.
Sinyal 4: rendering perangkat lunak dan jendela aneh
Peramban headless di server tidak punya GPU, sehingga WebGL beralih ke renderer perangkat lunak seperti SwiftShader atau llvmpipe. Nama renderer bisa dibaca melalui ekstensi WEBGL_debug_renderer_info bila peramban menyediakannya. Beberapa konfigurasi headless juga melaporkan jendela dengan lebar atau tinggi nol. Mesin virtual dan desktop jarak jauh memiliki ciri yang sama, jadi masing-masing adalah sinyal lemah.
Sinyal 5: sidik jari yang saling bertentangan
Peramban anti-deteksi dibuat agar tampak seperti banyak peramban sungguhan yang berbeda. Caranya dengan menimpa properti, dan penimpaan jarang benar-benar konsisten. Yang layak dibandingkan:
- Sistem operasi di user agent dengan
navigator.platformdan User-Agent Client Hints. - Keluarga peramban di user agent dengan fitur yang hanya dimiliki mesin tersebut.
- Font yang terpasang dengan font bawaan sistem operasi itu.
- Canvas yang digambar dua kali berturut-turut menghasilkan dua gambar berbeda — tanda derau yang disuntikkan.
Notification.permissionmenyatakan “denied” sementara Permissions API menyatakan “prompt”.
Setiap kontradiksi lemah bila sendiri, karena ekstensi privasi dan konfigurasi tak biasa juga menghasilkan sebagian. Dua atau tiga sekaligus adalah pola yang kuat.
Sinyal 6: token yang tidak pernah kembali
Teknik yang sederhana dan tangguh: minta skrip halaman pendaftaran meminta token sekali pakai berumur pendek, taruh di kolom tersembunyi formulir, lalu verifikasi di server. Bot yang melewati JavaScript Anda datang tanpa token yang valid; bot yang memakai ulang token lama datang dengan token yang sudah terpakai. Anda tidak perlu tahu bagaimana bot bekerja untuk menyadari bahwa ia tidak pernah benar-benar menjalankan halaman Anda. Buat token sekali pakai, terikat ke situs Anda, dan kedaluwarsa dalam hitungan menit.
Sinyal 7: perilaku, bukan sidik jari
Sidik jari bisa dipalsukan; perilaku jauh lebih sulit. Manusia membaca formulir, menggerakkan penunjuk, dan mengetik. Skrip mengisi kolom dan mengirim dalam beberapa ratus milidetik setelah halaman dimuat, tanpa satu pun event masukan yang tepercaya.
Pengukuran yang andal tidak butuh perangkat lunak tambahan: agen Anda menerbitkan token pengunjung saat halaman dimuat, dan server membandingkan waktu itu dengan saat pemeriksaan. Kurang dari sekitar satu detik dari muat sampai mendaftar berarti skrip. Bila agen juga dapat melaporkan event masukan tepercaya, pengiriman seketika tanpa event penunjuk, tombol, atau sentuhan menjadi konfirmasi kedua yang mandiri.
Catatan untuk sinyal 3: di Chrome saat ini trik DevTools hanya terpicu bila klien otomatisasi berlangganan event konsol, jadi anggap sebagai bonus, bukan detektor utama.
Gabungkan, jangan blokir karena satu sinyal
Perlakukan setiap sinyal sebagai poin dalam skor dan putuskan berdasarkan totalnya. Pembobotan awal yang wajar, dari terkuat ke terlemah:
| Sinyal | Bobot | Alasan |
|---|---|---|
navigator.webdriver true | tinggi | Hampir tidak pernah true untuk pengguna asli |
| User agent HeadlessChrome | tinggi | Hanya build headless yang mengirimnya |
| Token hilang atau dipakai ulang | tinggi | Skrip halaman tidak berjalan, atau berjalan sekali untuk banyak pendaftaran |
| Protokol DevTools terpasang | sedang | Pengembang dengan DevTools terbuka juga memicunya |
| Kontradiksi OS atau peramban | sedang | Penimpaan anti-deteksi, tetapi juga sebagian ekstensi |
| Renderer perangkat lunak, jendela nol | rendah | VM dan desktop jarak jauh juga memilikinya |
Gabungkan sinyal peramban dengan sinyal sisi server — pendaftaran dari rentang IP cloud, lonjakan dari satu subnet, akun yang terkait dengan perangkat yang sama — dan sangat sedikit bot yang akan tampak bersih di semuanya sekaligus.
Yang sebaiknya tidak dilakukan
- Jangan blokir hanya karena tidak ada plugin atau bahasa. Peramban yang diperkuat untuk privasi menghapusnya.
- Jangan kirim logika deteksi sebagai pemeriksaan bernama jelas yang bisa dicari operator lalu diakali sekaligus; kumpulkan fakta mentah di peramban dan putuskan di server.
- Jangan percaya begitu saja apa pun yang dilaporkan peramban. Klien berada di bawah kendali bot. Verifikasi terjadi di server Anda, dengan rahasia Anda.
Cara Attrelix melakukannya
Agen Attrelix mengumpulkan fakta peramban ini dan token pengunjung sekali pakai di halaman pendaftaran Anda; server menggabungkannya dengan sinyal jaringan, kotak masuk, dan akun terkait menjadi satu skor. Semua bobot dipublikasikan di dokumentasi, dan tidak ada satu pun sinyal lemah yang bisa mengirim pendaftaran ke tinjauan dengan sendirinya.
Ringkasan
- Bot modern memakai peramban sungguhan; cari di mana otomatisasi berbeda dari manusia.
- WebDriver, user agent headless, dan token yang hilang adalah sinyal kuat; sisanya lemah tetapi menumpuk.
- Putuskan di server berdasarkan skor, jangan pernah dari satu flag peramban.