Kedaluwarsa Token reCAPTCHA: Berapa Lama Token Tetap Valid

recaptcha token expiration - reCAPTCHA Token Expiration: How Long Tokens Stay Valid

Kedaluwarsa token reCAPTCHA adalah dua menit. Dokumentasi Google menyatakannya dengan jelas: setiap token respons berlaku dua menit dan hanya bisa diverifikasi sekali. Lewatkan salah satu dari keduanya dan server Anda menerima error yang sama dan sama-sama tidak membantu. Artikel ini membahas tiga penghitung waktu terpisah yang sering dikira satu, ke mana 120 detik itu sebenarnya habis dalam alur otomatis, dan perubahan urutan yang memperbaiki hampir setiap bug token kedaluwarsa.

Dua menit, dan tepat satu kali verifikasi

Aturan ini terdiri dari dua bagian dan keduanya sama-sama bisa menjatuhkan Anda.

Dua menit. Hitungan waktu dimulai saat token diterbitkan, bukan saat formulir Anda dikirim. Token yang menganggur di kolom tersembunyi sementara pengguna menyelesaikan ketikannya sudah menghabiskan jatahnya.

Satu kali verifikasi. Mengirim token yang sama ke Google dua kali akan gagal pada kali kedua, bahkan jika hanya berselang satu detik. Ini disengaja: inilah yang mencegah token yang tertangkap diputar ulang. Jika backend Anda memverifikasi sekali di middleware dan sekali lagi di handler, panggilan kedua gagal dan bug-nya tampak muncul sesekali.

Kedua kegagalan itu mengembalikan hal yang sama. Google mengirim respons verifikasi dengan success bernilai false dan kode error timeout-or-duplicate, yang berarti respons itu terlalu tua atau sudah pernah dipakai sebelumnya. Ia tidak memberi tahu Anda yang mana, jadi perlakukan keduanya sebagai satu kelas bug dan periksa keduanya.

Tiga penghitung waktu, bukan satu

Sebagian besar kebingungan di sini berasal dari menggabungkan tiga timer berbeda menjadi satu gagasan “kedaluwarsa token”. Ketiganya terpisah dan kedaluwarsa secara independen.

Penghitung waktuDurasiApa yang terjadi saat waktunya habis
Respons milik widget itu sendiri, checkbox v22 menitWidget membersihkan dirinya sendiri dan memicu callback expired. Kolom tersembunyi menjadi kosong
Token respons, di sisi server2 menitVerifikasi mengembalikan timeout-or-duplicate
Session Anda di situs targetBergantung pada situsTidak berkaitan dengan reCAPTCHA. Token baru tidak akan memperbaiki session yang mati

Yang pertama adalah yang tidak pernah diantisipasi orang, karena berada di sisi client dan berjalan diam-diam. Pada checkbox v2, widget membatalkan jawabannya sendiri setelah dua menit dan memanggil fungsi apa pun yang Anda daftarkan sebagai callback expired. Jika Anda tidak mendaftarkan apa pun, kotak yang tercentang tetap terlihat tercentang di layar sementara kolom tersembunyi di baliknya kosong, jadi formulir terkirim tanpa token sama sekali dan server melaporkan error missing-input, bukan error kedaluwarsa.

<!-- Register the callback. Without it the box looks ticked
     while the value behind it is already gone. -->
<div class="g-recaptcha"
     data-sitekey="YOUR_SITEKEY"
     data-callback="onSolved"
     data-expired-callback="onExpired"></div>

<script>
function onExpired() {
  // Reset the widget and re-enable whatever you disabled.
  grecaptcha.reset();
}
</script>

Berapa lama tantangan lain bertahan?

Dua menit tidak berlaku universal. Jika Anda menangani lebih dari satu tipe tantangan, jatah waktunya cukup berbeda untuk diperhatikan.

ChallengeToken berlaku selamaBisa dipakai ulang
reCAPTCHA v2, checkbox dan Invisible2 menitTidak
reCAPTCHA v32 menitTidak
reCAPTCHA Enterprise2 menitTidak
Cloudflare Turnstile5 menitTidak
GeeTest v3Segera kirim kembaliTidak

Turnstile adalah yang paling longgar. Cloudflare, di panduan validasi sisi server miliknya, memberi token 300 detik dan menolak token yang diputar ulang dengan kode timeout-or-duplicate yang sama seperti yang dipakai Google. GeeTest v3 bekerja sebaliknya: nilai challenge yang Anda masukkan ke pemecahan bersifat sekali pakai dan kedaluwarsa dalam sekitar satu menit, jadi tenggatnya ada sebelum pemecahan, bukan sesudahnya. Ambil nilai itu tepat sebelum memecahkan, jangan pernah di awal skrip.

Ke mana dua menit itu sebenarnya habis

Pada formulir yang diisi manual, jatah waktunya sangat besar. Pada alur otomatis, jatah itu lebih ketat daripada kelihatannya, karena pemecahan tidak instan.

LangkahWaktu tipikal
Muat halaman dan baca sitekey1 sampai 3 detik
Pecahkan reCAPTCHA v215 hingga 20 detik
Pecahkan reCAPTCHA v310 hingga 15 detik
Sisipkan token dan kirimkurang dari satu detik
Sisasekitar 95 detik

Kelonggaran sembilan puluh lima detik terasa nyaman sampai ada hal lain yang menyelip di tengah. Penyebab yang biasa adalah handshake proxy, langkah login yang disisipkan antara pemecahan dan pengiriman, rate limiter yang menidurkan worker Anda, atau queue yang mengumpulkan token hasil pemecahan untuk dipakai belakangan. Yang terakhir itu tidak pernah berhasil: token adalah barang yang cepat basi, bukan sumber daya yang bisa Anda kumpulkan dalam pool.

Ambil token paling akhir

Perbaikan untuk hampir setiap bug token kedaluwarsa adalah urutan. Kerjakan semua yang lambat lebih dulu, dan ambil token sebagai langkah terakhir sebelum request yang memakainya.

# pip install capskip
from capskip import CapSkip

solver = CapSkip(host="127.0.0.1", port=8080)

# Slow things first: log in, warm the session, pick up cookies.
session = build_session()
sitekey = read_sitekey(session, PAGE_URL)

# Then solve, so the clock starts as late as possible.
result = solver.recaptcha(sitekey=sitekey, url=PAGE_URL)

# And submit straight away. Nothing goes between these two lines.
session.post(PAGE_URL, data={"g-recaptcha-response": result["code"]})

Dua aturan mengikuti dari sini, dan keduanya mencakup sebagian besar sisanya.

  • Jangan pernah menyimpan token di cache. Tidak di Redis, tidak di variabel yang hidup lebih lama daripada request, tidak juga lintas percobaan ulang. Pecahkan lagi sebagai gantinya
  • Jangan pernah memverifikasi dua kali. Verifikasi tepat di satu tempat. Jika sebuah middleware sudah memeriksa token, route handler harus membaca hasil itu alih-alih memanggil Google lagi

Percobaan ulang layak dibahas tersendiri. Jika pengiriman gagal dan Anda mengulanginya, token yang sudah Anda kirim itu habis terpakai, jadi percobaan ulang butuh pemecahan baru. Mengulang seluruh unit pekerjaan adalah cara yang benar. Mengulang hanya panggilan HTTP dengan token lama akan memberi Anda timeout-or-duplicate setiap kali dan tampak seperti pemecah yang mengembalikan jawaban buruk.

Latensi, dan di mana pemecah berjalan

Karena CapSkip berjalan di perangkat keras Anda sendiri, tidak ada bagian dari jatah dua menit yang terpakai untuk menjangkau endpoint pihak ketiga lewat internet. Mode Local mendengarkan di 127.0.0.1 dan panggilannya tidak pernah keluar dari komputer itu.

Mode Server mengubah hal itu sedikit dan seberapa besarnya layak diketahui. Mengarahkan worker Anda ke pemecah bersama di jaringan Anda atau di VPS dengan IP publik menambah satu hop jaringan per panggilan, yang berarti hitungan milidetik di LAN dan puluhan milidetik ke VPS di region yang sama. Dibandingkan 120 detik, itu hanya derau, dan Anda mendapat satu pemecah yang melayani seluruh armada. Kedua mode dikonfigurasi di pengaturan koneksi, dan IP publik statis direkomendasikan untuk kasus server.

Satu detail CapSkip juga relevan di sini: hasil pemecahan hanya bisa dibaca sekali. Melakukan polling pada job id yang sama untuk kedua kalinya tidak akan mengembalikan jawabannya lagi, jadi simpan token saat Anda pertama kali membacanya alih-alih mengambilnya lagi belakangan.

FAQ

Bisakah saya memperpanjang dua menit itu?

Tidak. Jendela waktu itu ditegakkan oleh Google dan tidak ada pengaturan situs, parameter atau paket yang mengubahnya. Satu-satunya tuas yang Anda punya adalah mengerjakan lebih sedikit hal antara pemecahan dan pengiriman.

Apakah token v3 kedaluwarsa lebih cepat karena skornya?

Tidak. Token v3 mendapat dua menit yang sama seperti v2. Skor adalah hal yang benar-benar terpisah: ia menggambarkan seperti apa trafiknya, bukan berapa lama jawabannya bertahan, dan skor itu tidak menurun selama token belum dipakai. Perlu dicatat bahwa CapSkip tidak punya opsi skor minimum, jadi tidak ada apa pun di sisi pemecahan yang terikat padanya.

Token saya bekerja secara lokal tetapi kedaluwarsa di produksi. Kenapa?

Hampir selalu karena queue. Jalannya di lokal langsung dari pemecahan ke pengiriman, sementara produksi melewatkan job itu ke broker, worker pool atau rate limiter dulu. Ukur jarak antara kedua timestamp di produksi dan biasanya Anda akan menemukan jaraknya lebih dari 120 detik. Pindahkan pemecahan ke worker yang melakukan pengiriman.

Apakah timeout-or-duplicate pernah menjadi kesalahan situsnya?

Kadang. Halaman yang memverifikasi sendiri token itu sebelum meneruskan request Anda akan memakainya, sehingga verifikasi Anda sendiri kemudian gagal sebagai duplikat. Lapisan proxy dan web application firewall kadang melakukan hal yang sama. Jika sebuah token gagal pada pemakaian pertama padahal timestamp-nya masih bersih, curigai ada sesuatu di hulu Anda yang sudah memakainya.

Versi singkatnya

Dua menit, satu kali verifikasi, dan tiga penghitung waktu terpisah yang sering dikira satu. Daftarkan callback expired agar kasus di browser terlihat, pecahkan selambat mungkin, dan jangan pernah menyimpan di cache atau memutar ulang token. Karena pemecahan ulang itu gratis di pemecah captcha lokal, memecahkan lagi selalu menjadi jawaban yang tepat untuk token yang kedaluwarsa. Untuk mekanisme masing-masing versi, lihat panduan reCAPTCHA v2 dan panduan v3, halaman Turnstile untuk kasus lima menit, dan apa itu reCAPTCHA untuk latar belakangnya.