reCAPTCHA Token Süresi: Token'lar Ne Kadar Geçerli Kalır

reCAPTCHA token süresi iki dakikadır. Google’ın belgeleri bunu açıkça yazıyor: her yanıt token'ı iki dakika geçerlidir ve yalnızca bir kez doğrulanabilir. İki koşuldan birini kaçırın, sunucunuz aynı işe yaramaz hatayı geri alır. Bu yazı, insanların tek sandığı üç ayrı saati, otomatik bir akışta o 120 saniyenin gerçekte nereye gittiğini ve süresi dolmuş token hatalarının neredeyse tamamını çözen sıralama değişikliğini anlatıyor.
İki dakika ve tam olarak tek bir doğrulama
Kuralın iki yarısı var ve ikisi de canınızı yakar.
İki dakika. Saat, token verildiğinde başlar; formunuz gönderildiğinde değil. Kullanıcı yazmayı bitirirken gizli bir alanda bekleyen bir token, bütçesini şimdiden harcıyordur.
Tek doğrulama. Aynı token'ı Google'a ikinci kez göndermek, bir saniye sonra bile olsa başarısız olur. Bu bilinçlidir: yakalanmış bir token'ın tekrar oynatılmasını engelleyen şey budur. Arka ucunuz bir middleware'de bir kez, handler'da bir kez daha doğruluyorsa ikinci çağrı başarısız olur ve hata aralıklı görünür.
Her iki başarısızlık da aynı şeyi döndürür. Google’ın doğrulama yanıtı success değeri false ve şu hata koduyla geri gelir: timeout-or-duplicate, yani yanıt ya çok eskidir ya da daha önce kullanılmıştır. Hangisi olduğunu söylemez, bu yüzden ikisini tek bir hata sınıfı olarak ele alın ve her ikisini de kontrol edin.
Tek saat değil, üç saat
Buradaki kafa karışıklığının çoğu, üç farklı zamanlayıcıyı tek bir “token süresi doluyor” fikrine indirgemekten gelir. Bunlar ayrıdır ve birbirinden bağımsız olarak sona erer.
| Saat | Süre | Süresi dolunca ne olur |
|---|---|---|
| Widget yanıtının kendisi, v2 onay kutusu | 2 dakika | Widget kendini temizler ve expired callback'i tetikler. Gizli alan boşalır |
| Yanıt token'ı, sunucu tarafı | 2 dakika | Doğrulama timeout-or-duplicate döndürür |
| Hedef sitedeki oturumunuz | Siteye özgü | reCAPTCHA ile ilgisi yok. Yeni bir token ölü bir oturumu düzeltmez |
İlkini kimse gelirken göremez, çünkü istemci tarafındadır ve sessizdir. Bir v2 onay kutusunda widget iki dakika sonra kendi cevabını geçersiz kılar ve expired callback olarak kaydettiğiniz fonksiyonu çağırır. Hiçbir şey kaydetmediyseniz, işaretli kutu ekranda işaretli kalırken arkasındaki gizli alan boş olur; böylece form hiç token olmadan gönderilir ve sunucu, süresi dolmuş bir token hatası yerine eksik girdi hatası bildirir.
<!-- 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>Diğer challenge'lar ne kadar dayanır?
İki dakika evrensel değil. Birden fazla challenge türüyle uğraşıyorsanız, bütçeler fark yaratacak kadar değişir.
| Challenge | Token geçerlilik süresi | Yeniden kullanılabilir |
|---|---|---|
| reCAPTCHA v2, Checkbox ve Invisible | 2 dakika | Hayır |
| reCAPTCHA v3 | 2 dakika | Hayır |
| reCAPTCHA Enterprise | 2 dakika | Hayır |
| Cloudflare Turnstile | 5 dakika | Hayır |
| GeeTest v3 | Hemen geri gönderin | Hayır |
Cömert olanı Turnstile. Cloudflare’ın sunucu tarafı doğrulama kılavuzu bir token'a 300 saniye tanır ve tekrar oynatılan bir token'ı Google'ın kullandığı aynı timeout-or-duplicate koduyla reddeder. GeeTest v3 tam tersi çalışır: çözüme verdiğiniz challenge değeri tek kullanımlıktır ve yaklaşık bir dakikada süresi dolar, yani son tarih çözümden sonra değil öncesindedir. Onu çözmeden hemen önce alın, asla bir betiğin en başında değil.
İki dakika gerçekte nereye gidiyor
Elle doldurulan bir formda bütçe devasadır. Otomatik bir akışta ise göründüğünden daha dardır, çünkü çözüm anlık değildir.
| Adım | Tipik süre |
|---|---|
| Sayfayı yüklemek ve sitekey'i okumak | 1 ila 3 saniye |
| Bir reCAPTCHA v2 çözmek | 15 ila 20 saniye |
| Bir reCAPTCHA v3 çözmek | 10 ila 15 saniye |
| Token'ı enjekte edip göndermek | bir saniyenin altında |
| Kalan | yaklaşık 95 saniye |
Doksan beş saniyelik pay, araya başka bir şey girmediği sürece rahattır. Alışılmış suçlular şunlardır: bir proxy el sıkışması, çözümle gönderim arasına eklenen bir giriş adımı, worker'ınızı uyutan bir hız sınırlayıcı ya da çözülmüş token'ları sonradan kullanmak üzere biriktiren bir kuyruk. Sonuncusu hiçbir zaman işe yaramaz: token dayanıksız bir maldır, havuzlayabileceğiniz bir kaynak değil.
Token'ı en son alın
Süresi dolmuş token hatalarının neredeyse tamamının çözümü sıralamadır. Yavaş olan her şeyi önce yapın ve token'ı, onu tüketen isteğin hemen öncesindeki son adım olarak alın.
# 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"]})Bundan iki kural çıkar ve geri kalanın çoğunu bu ikisi kapsar.
- Bir token'ı asla önbelleğe almayın. Redis'te değil, isteği aşan bir değişkende değil, bir yeniden deneme boyunca da değil. Bunun yerine yeniden çözün
- Asla iki kez doğrulamayın. Tam olarak tek bir yerde doğrulayın. Bir middleware token'ı zaten kontrol ettiyse, route handler Google'ı yeniden çağırmak yerine o sonucu okumalıdır
Yeniden denemeler ayrı bir not hak ediyor. Gönderim başarısız olur ve yeniden denerseniz, daha önce gönderdiğiniz token harcanmıştır; yani yeniden deneme yeni bir çözüm gerektirir. İş biriminin tamamını yeniden denemek doğrudur. Yalnızca HTTP çağrısını eski token'la yeniden denemek size her seferinde timeout-or-duplicate verir ve çözücü kötü cevaplar döndürüyormuş gibi görünür.
Gecikme ve çözücünün nerede çalıştığı
CapSkip kendi donanımınızda çalıştığı için, iki dakikalık bütçenin hiçbir kısmı internet üzerinden üçüncü taraf bir uç noktaya ulaşmaya harcanmaz. Local mod 127.0.0.1 adresini dinler ve çağrı makineden hiç çıkmaz.
Server mod bunu biraz değiştirir ve ne kadar değiştirdiğini bilmekte fayda var. Worker'larınızı ağınızdaki ya da genel IP'si olan bir VPS üzerindeki ortak bir çözücüye yönlendirmek, çağrı başına bir ağ sıçraması ekler; bu da LAN'da milisaniyeler, aynı bölgedeki bir VPS'te onlarca milisaniyedir. 120 saniyenin yanında bu gürültüden ibarettir ve karşılığında tüm bir filoya hizmet veren tek bir çözücü kazanırsınız. Her iki mod da şurada yapılandırılır: bağlantı ayarları, sunucu durumunda ise statik bir genel IP önerilir.
Bir CapSkip ayrıntısı da buraya ait: çözülmüş bir sonuç yalnızca bir kez okunabilir. Aynı iş kimliğini ikinci kez yoklamak cevabı tekrar döndürmez, bu yüzden token'ı sonradan yeniden çekmek yerine ilk okuduğunuzda saklayın.
FAQ
İki dakikayı uzatabilir miyim?
Hayır. Pencere Google tarafından dayatılır ve bunu değiştiren bir site ayarı, parametre veya plan yoktur. Elinizdeki tek kaldıraç, çözümle gönderim arasında daha az iş yapmaktır.
Bir v3 token'ının süresi puan yüzünden daha hızlı mı dolar?
Hayır. v3 token'ları v2 ile aynı iki dakikayı alır. Puan tamamen ayrı bir şeydir: cevabın ne kadar süreceğini değil, trafiğin nasıl göründüğünü anlatır ve token kullanılmadan beklerken azalmaz. CapSkip'te minimum puan seçeneği bulunmadığını da not edin; yani çözüm tarafında da buna bağlı bir şey yoktur.
Token'ım yerelde çalışıyor, üretimde süresi doluyor. Neden?
Neredeyse her zaman bir kuyruk yüzünden. Yerel çalıştırmalar çözümden gönderime doğrudan geçer; üretim ise işi önce bir aracıdan, bir worker havuzundan veya bir hız sınırlayıcıdan geçirir. Üretimde iki zaman damgası arasındaki farkı ölçün, genellikle 120 saniyenin üzerinde olduğunu göreceksiniz. Çözümü, gönderimi yapan worker'a taşıyın.
timeout-or-duplicate hiç sitenin suçu olur mu?
Bazen. İsteğinizi iletmeden önce token'ı kendisi doğrulayan bir sayfa onu tüketir; böylece sizin doğrulamanız yinelenmiş sayılarak başarısız olur. Proxy katmanları ve web uygulaması güvenlik duvarları da arada bir aynısını yapar. Bir token temiz bir zaman damgasıyla ilk kullanımda başarısız oluyorsa, sizden önceki bir katmanın onu harcadığından şüphelenin.
Kısa özet
İki dakika, tek doğrulama ve insanların tek sandığı üç ayrı saat. Tarayıcı tarafındaki durum görünür olsun diye expired callback'i kaydedin, çözümü yapabildiğiniz kadar geç yapın ve bir token'ı asla önbelleğe almayın veya yeniden kullanmayın. Yeniden çözmek, bir yerel captcha çözücüüzerinde ücretsiz olduğundan, süresi dolmuş bir token için doğru cevap her zaman yeniden çözmektir. Her sürümün mekaniği için şunlara bakın: reCAPTCHA v2 kılavuzu ve v3 kılavuzu, Turnstile sayfası , beş dakikalık durum için ve reCAPTCHA nedir , arka plan için.
