Explainers

Görünmez CAPTCHA sistemleri nasıl çalışır?

Formunuz bazı kullanıcılarda sorunsuz çalışıp bazılarında sessizce başarısız oluyor, üstelik sayfada tıklanacak bir onay kutusu ya da çözülecek bir görsel yoksa: büyük olasılıkla görünmez bir CAPTCHA ile karşı karşıyasınız. Görünmez CAPTCHA'lar kullanıcıyı görünür bir doğrulama göstermeden, tamamen arka planda çalışan JavaScript ile değerlendirir; tarayıcı davranışını, cihaz sinyallerini ve ağ itibarını analiz eder.

Görünmez doğrulamayı klasik CAPTCHA'lardan ayıran üç şey vardır:

  • Tıklanacak bir onay kutusu yoktur.
  • Çözülecek bir görsel ızgara yoktur.
  • Yazılacak bir metin yoktur.

Görünmez CAPTCHA nasıl çalışır?

Türü ne olursa olsun tüm görünmez CAPTCHA'lar aynı temel modeli izler:

Page loads → CAPTCHA JavaScript injected
    ↓
Script runs in background, collecting signals:
  ├─ Browser test profil yapılandırması (canvas, WebGL, fonts, plugins)
  ├─ Behavioral data (mouse, keyboard, scroll, timing)
  ├─ Network data (IP reputation, TLS test profil yapılandırması)
  ├─ Device data (screen, GPU, CPU cores, memory)
  └─ History data (cookies, previous CAPTCHA completions)
    ↓
Signals sent to CAPTCHA provider's risk engine
    ↓
Risk score computed
    ↓
Response varies by score:
  ├─ Low risk  → Token issued silently (user sees nothing)
  ├─ Medium    → Light challenge shown (checkbox, simple click)
  └─ High risk → Full challenge (image grid) or block

Görünür CAPTCHA'lardan en temel farkı şudur: doğrulama yalnızca kullanıcı bir onay kutusuna tıkladığında değil, sayfa yüklendiği andan itibaren kesintisiz çalışır. Hesaplanan risk puanına göre motor üç yoldan birini seçer:

  • Düşük risk → token sessizce verilir, kullanıcı hiçbir şey görmez.
  • Orta risk → hafif bir doğrulama (onay kutusu, tek tık) gösterilir.
  • Yüksek risk → tam doğrulama (resim ızgarası) gösterilir veya istek engellenir.

Türkiye'de görünmez CAPTCHA'yla nerede karşılaşırsınız?

Görünmez doğrulama, Türk geliştiricilerin en sık test ettiği akışlarda karşınıza çıkar:

  • E-ticaret ve fintech formları — kayıt ve ödeme adımlarında otomatik QA akışları sessizce reddedilebilir.
  • Giriş ve parola sıfırlama sayfaları — reCAPTCHA v3 en çok buralarda devreye girer.
  • Başvuru ve randevu portalları — görünmez reCAPTCHA yaygındır; testleri yalnızca yetkiniz olan sistemlerde yürütün.

KVKK kapsamında, test sırasında topladığınız kişisel verilere dikkat edin ve mümkün olduğunda gerçek veri yerine örnek verilerle çalışın.


Başlıca görünmez CAPTCHA türleri

1. reCAPTCHA v3

  • Sağlayıcı: Google
  • Sürüm: 2018
  • Pazar payı: Görünmez CAPTCHA'lar arasında en yüksek

reCAPTCHA v3, her sayfa eylemi için 0,0 ile 1,0 arasında bir kayan nokta puanı döndürür. Bu puanla ne yapılacağına tamamen web sitesi sahibi karar verir; v3 kendisi hiçbir şeyi engellemez, yalnızca skor üretir.

Sinyalleri nasıl toplar:

<!-- reCAPTCHA v3 integration -->
<script src="https://www.google.com/recaptcha/api.js?render=SITE_KEY"></script>
<script>
  grecaptcha.ready(function() {
    grecaptcha.execute('SITE_KEY', { action: 'login' }).then(function(token) {
      // Token sent to server for verification
      document.getElementById('captcha-token').value = token;
    });
  });
</script>

execute() çağrısı sinyal toplamayı istek üzerine tetikler. Ancak perde arkasında reCAPTCHA, betik yüklendiği andan itibaren zaten veri topluyordur.

Puanın yorumlanması:

Puan Anlamı Tipik eylem
0,9 Çok büyük ihtimalle insan İzin ver
0,7 Muhtemelen insan İzleyerek izin ver
0,5 Belirsiz Ek doğrulama iste
0,3 Muhtemelen bot Engelle veya reCAPTCHA v2 göster
0,1 Büyük olasılıkla bot Engelle

Sayfa kaynağından tespit:

import requests
import re

def detect_recaptcha_v3(url):
    html = requests.get(url, timeout=10).text
    indicators = {
        "recaptcha_v3": False,
        "site_key": None,
        "actions": [],
    }

    # Check for v3 script
    if "recaptcha/api.js?render=" in html:
        indicators["recaptcha_v3"] = True
        match = re.search(r"render=([A-Za-z0-9_-]+)", html)
        if match:
            indicators["site_key"] = match.group(1)

    # Find action names
    actions = re.findall(r"action:\s*['\"](\w+)['\"]", html)
    indicators["actions"] = actions

    return indicators

print(detect_recaptcha_v3("https://staging.example.com/qa-login"))

2. Cloudflare Turnstile

  • Sağlayıcı: Cloudflare
  • Sürüm: 2022
  • Pazar payı: En hızlı büyüyen

Turnstile, kullanıcı verisi toplamaya gerek kalmadan çok aşamalı bir doğrulama hattı kullanır. Aşamalar şöyle ilerler:

  1. Private Access Token kontrolü — Tarayıcı Apple PAT'i destekliyorsa doğrulama anında tamamlanır
  2. Etkileşimli olmayan doğrulama — Tarayıcı, hafif bir kriptografik iş kanıtı (proof-of-work) bulmacasını çözer
  3. Yönetilen doğrulama — Cloudflare, ağından gelen risk sinyallerine göre etkileşimli ve etkileşimsiz arasında karar verir (internet trafiğinin %20'sinden fazlası Cloudflare üzerinden akar)
  4. Etkileşimli doğrulama — Yalnızca risk puanı yüksek olduğunda gösterilir; onay kutusu stilinde bir widget açar

Entegrasyon:

<!-- Turnstile widget -->
<div class="cf-turnstile" data-sitekey="0x4AAAAAAAC3DHQhMMQ_Rxrg"></div>
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>

Tespit:

def detect_turnstile(url):
    html = requests.get(url, timeout=10).text
    indicators = {
        "turnstile": False,
        "site_key": None,
    }

    if "challenges.cloudflare.com/turnstile" in html or "cf-turnstile" in html:
        indicators["turnstile"] = True
        match = re.search(r'data-sitekey="([^"]+)"', html)
        if match:
            indicators["site_key"] = match.group(1)

    return indicators

3. reCAPTCHA v2 Invisible (görünmez)

  • Sağlayıcı: Google
  • Sürüm: 2017

Bu, form gönderiminde programatik olarak tetiklenen reCAPTCHA v2'dir. Görünür bir onay kutusu yoktur; kullanıcı gönder düğmesine tıklar ve reCAPTCHA arka planda çalışır. Risk puanı yeterince yüksekse açılır pencerede görsel bir doğrulama belirir.

<button class="g-recaptcha"
        data-sitekey="SITE_KEY"
        data-callback="onSubmit"
        data-size="invisible">
    Submit
</button>

v3'ten temel farkı: v2 Invisible, riskli kullanıcılar için hâlâ görünür bir doğrulamaya düşebilir. v3 ise hiçbir zaman görünür bir doğrulama göstermez — puanla ne yapılacağına web sitesi karar vermek zorundadır.

4. hCaptcha Passive (yalnızca Enterprise)

  • Sağlayıcı: Intuition Machines
  • Kullanılabilirlik: Yalnızca Enterprise katmanı

hCaptcha Enterprise'ın pasif modu, kullanıcıyı görünür bir widget olmadan değerlendirir. Standart hCaptcha ile aynı davranışsal sinyalleri kullanır, ancak yalnızca en şüpheli ziyaretçilere görsel bir doğrulama sunar. Not: CaptchaAI hCaptcha'yı çözmez; bu tür yalnızca bütünlük için açıklanmıştır.

5. Apple Private Access Token (PAT)

  • Sağlayıcı: Apple
  • Kullanılabilirlik: iOS 16+, macOS Ventura+

Bu bir CAPTCHA türü değil, doğrulamayı gereksiz kılan donanım tabanlı bir güven mekanizmasıdır. Apple cihazları, donanım doğrulamasıyla meşru olduklarını kanıtlar ve web sitesinin kullanıcıya hiç CAPTCHA göstermeden doğrulamayı tamamlamasına olanak tanır.

Device attestation:

  1. Website requests a challenge from a token issuer
  2. Device proves it is genuine without revealing identity
  3. Token issuer generates a blind-signed token
  4. Website verifies token → CAPTCHA skipped

Cloudflare, Fastly ve diğer CDN sağlayıcıları tarafından desteklenir.


Görünmez CAPTCHA türleri karşılaştırması

Aşağıdaki karşılaştırma, sağlayıcıların kamuya açık dokümantasyonuna dayanır; özellikler zamanla değişebilir.

Özellik reCAPTCHA v3 Turnstile reCAPTCHA v2 Invisible hCaptcha Passive
Görünür doğrulama Asla Nadiren Bazen (geri dönüş) Nadiren
Gizlilik Tarama verisi toplar Kişisel veri yok Tarama verisi toplar Etkileşim verisi toplar
Maliyet Ücretsiz (1M/ay) Ücretsiz (sınırsız) Ücretsiz (1M/ay) Yalnızca Enterprise
Puan döndürür mü Evet (0,0–1,0) Hayır (geçer/kalır) Hayır (geçer/kalır) Evet (Enterprise)
Geri dönüş doğrulaması Web sitesi karar verir Cloudflare yönetir Resim ızgarası açılır penceresi Resim ızgarası açılır penceresi
CaptchaAI desteği Evet (userrecaptcha) Evet (turnstile) Evet (userrecaptcha) ❌ henüz desteklenmiyor

CaptchaAI ile görünmez CAPTCHA token'ları üretme

Görünür bir doğrulama olmasa bile görünmez CAPTCHA'lar, formla birlikte gönderilmesi gereken token'lar üretmeye devam eder. API tabanlı çözücüler bu token'ı harici olarak üretir; ardından token'ı gizli form alanına yerleştirir veya istekle birlikte gönderirsiniz.

Örneklerdeki pageurl ve sitekey değerlerini kendi hedef sayfanızınkilerle, YOUR_API_KEY yer tutucusunu da panelinizden aldığınız anahtarla değiştirin.

reCAPTCHA v3 token'ı üretme

import requests
import time

API_KEY = "YOUR_API_KEY"

submit = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY,
    "method": "userrecaptcha",
    "googlekey": "6LdKlZEpAAAAAAOQjzC2v_d36tWxCl6dWsozdSy9",
    "pageurl": "https://staging.example.com/qa-login",
    "version": "v3",
    "action": "login",
    "json": 1,
})

task_id = submit.json()["request"]

for _ in range(60):
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": API_KEY,
        "action": "get",
        "id": task_id,
        "json": 1,
    }).json()

    if result.get("status") == 1:
        token = result["request"]
        print(f"reCAPTCHA v3 token received (score ≥ 0.9)")
        break

Cloudflare Turnstile token'ı üretme

submit = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY,
    "method": "turnstile",
    "sitekey": "0x4AAAAAAAC3DHQhMMQ_Rxrg",
    "pageurl": "https://example.com/signup",
    "json": 1,
})

task_id = submit.json()["request"]

for _ in range(60):
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": API_KEY,
        "action": "get",
        "id": task_id,
        "json": 1,
    }).json()

    if result.get("status") == 1:
        turnstile_token = result["request"]
        print(f"Turnstile token received")
        break

Node.js ile reCAPTCHA v3

const axios = require("axios");

async function solveRecaptchaV3(siteKey, pageUrl, action) {
    const API_KEY = "YOUR_API_KEY";

    // Submit
    const { data: submit } = await axios.post(
        "https://ocr.captchaai.com/in.php",
        new URLSearchParams({
            key: API_KEY,
            method: "userrecaptcha",
            googlekey: siteKey,
            pageurl: pageUrl,
            version: "v3",
            action: action,
            json: 1,
        })
    );

    const taskId = submit.request;

    // Poll
    for (let i = 0; i < 60; i++) {
        await new Promise((r) => setTimeout(r, 5000));
        const { data: result } = await axios.get(
            "https://ocr.captchaai.com/res.php",
            {
                params: {
                    key: API_KEY,
                    action: "get",
                    id: taskId,
                    json: 1,
                },
            }
        );

        if (result.status === 1) {
            return result.request;
        }
    }

    throw new Error("Solve timeout");
}

solveRecaptchaV3("SITE_KEY", "https://staging.example.com/qa-login", "login")
    .then((token) => console.log("Token:", token.substring(0, 50) + "..."));

Sayfadaki görünmez CAPTCHA'ları tespit etme

Aşağıdaki denetleyici, bir sayfadaki tüm görünmez CAPTCHA türlerini tek seferde tarar; hangi çözücü yöntemine ihtiyaç duyacağınızı önceden belirlemek için pratiktir.

import requests
import re

def detect_invisible_captcha(url):
    """Detect all invisible CAPTCHA types on a page."""
    html = requests.get(url, timeout=10).text

    results = []

    # reCAPTCHA v3
    if "recaptcha/api.js?render=" in html:
        key = re.search(r"render=([A-Za-z0-9_-]+)", html)
        results.append({
            "type": "reCAPTCHA v3",
            "site_key": key.group(1) if key else "unknown",
            "solver_method": "userrecaptcha (version=v3)",
        })

    # reCAPTCHA v2 invisible
    if 'data-size="invisible"' in html and "g-recaptcha" in html:
        key = re.search(r'data-sitekey="([^"]+)"', html)
        results.append({
            "type": "reCAPTCHA v2 Invisible",
            "site_key": key.group(1) if key else "unknown",
            "solver_method": "userrecaptcha (invisible=1)",
        })

    # Cloudflare Turnstile
    if "challenges.cloudflare.com/turnstile" in html:
        key = re.search(r'data-sitekey="([^"]+)"', html)
        results.append({
            "type": "Cloudflare Turnstile",
            "site_key": key.group(1) if key else "unknown",
            "solver_method": "turnstile",
        })

    # hCaptcha (passive mode detected by script without visible widget)
    if "hcaptcha.com/1/api.js" in html and 'data-size="invisible"' in html:
        results.append({
            "type": "hCaptcha Passive",
            "solver_method": "hcaptcha",
        })

    if not results:
        results.append({"type": "none detected"})

    return results

for item in detect_invisible_captcha("https://example.com"):
    print(item)

Sık sorulan sorular

Görünmez CAPTCHA'lar hakkında Türk geliştiricilerden en sık gelen sorular ve kısa yanıtları:

Bir sayfada görünmez CAPTCHA olup olmadığını nasıl anlarım?

Sayfa kaynağında şu sağlayıcı betiklerini arayın:

  • recaptcha/api.js?render= → reCAPTCHA v3
  • challenges.cloudflare.com/turnstile → Turnstile
  • data-size="invisible" ile birlikte hcaptcha.com/1/api.js → hCaptcha pasif

Widget sayfada görünür olmadığı için HTML'yi veya ağ isteklerini incelemeniz gerekir.

Görünmez CAPTCHA çözmek için gerçek bir tarayıcı çalıştırmam gerekir mi?

Hayır, headless bir tarayıcıya ihtiyacınız yoktur. API tabanlı bir çözücüde işleyiş şöyledir:

  • sitekey ve pageurl değerlerini API'ye gönderirsiniz.
  • Dönen token'ı formunuza yerleştirirsiniz.
  • Token'ı tamamen sunucu tarafında üretirsiniz.

reCAPTCHA v3 puanım sürekli düşük geliyor, nedeni ne olabilir?

Yaygın nedenler şunlardır:

  • action değeri sayfadaki gerçek eylemle eşleşmiyordur.
  • İstek düşük itibarlı bir IP aralığından geliyordur.
  • Token eksik, süresi dolmuş ya da çok geç gönderilmiştir.

Doğru action adını gönderdiğinizden ve hedef eşiğin aşırı katı ayarlanmadığından emin olun.

Görünmez CAPTCHA'lı formları test etmek KVKK açısından uygun mu?

Test sürecinde topladığınız her kişisel veri KVKK kapsamındadır. Doğrulama testlerini yalnızca sahibi olduğunuz veya açık izin aldığınız sistemlerde, tercihen staging ortamında ve gerçek kişisel veri yerine örnek verilerle yürütün.


Pratik: reCAPTCHA v3 puanlarını yönetme

reCAPTCHA v3 size yalnızca bir puan verir; asıl iş, bu puana göre ne yapacağınıza karar vermektir.

  • İş akışınız üretim trafiğine çıkmadan önce yüksek, orta ve düşük puanlarda ne olacağını net biçimde tanımlayın.
  • Hedefin altındaki her puanı doğrudan başarısızlık saymak yerine, orta puanları ek doğrulama adımlarını tetiklemek için kullanın.
  • Puan dağılımını zaman içinde loglayın; böylece hedef sitedeki eşik değişikliği, dönüşüm oranınız düşmeden önce fark edilir hale gelir.

Özet

Görünmez CAPTCHA'lar kullanıcıyı hiçbir görünür etkileşim olmadan; tarayıcı davranışı, cihaz sinyalleri ve ağ itibarını arka planda analiz ederek doğrular. Baskın uygulamalar reCAPTCHA v3 ve Cloudflare Turnstile'dır; Turnstile, ücretsiz fiyatlandırması ve gizlilik odaklı tasarımı sayesinde en hızlı büyüyen seçenektir. Otomasyonda bu doğrulamalar hâlâ geçerli token gerektirir. Bu token'ları CaptchaAI ile üretebilirsiniz: reCAPTCHA v3 için version=v3 parametreli userrecaptcha yöntemi, Cloudflare Turnstile için yüksek başarı oranıyla turnstile yöntemi.

İlgili makaleler

Bu makale için yorumlar devre dışı bırakılmıştır.