Ana içeriğe atla
← Tüm makaleler
bot_accessİleri11 dk okumaSon güncelleme: 30 Nis 2026

Web Bot Auth: HTTP Message Signatures ile Ajan Kimliği

RFC 9421 HTTP Message Signatures ile bot trafiğini kimlikle doğrulayın. Cloudflare key directory, AIDE'nin bots-web-bot-auth ve web-bot-auth-detected kontrolleri.

  • #web-bot-auth
  • #rfc9421
  • #http-signatures
  • #cloudflare
  • #advanced

User-Agent string'i bot kimliği için bittikçe yetersiz — herkes spoof edebiliyor. Web Bot Auth (Cloudflare + IETF, 2025), RFC 9421 HTTP Message Signatures üzerine kurulu, kriptografik olarak doğrulanabilir bot kimliği veriyor. AIDE'nin bots-web-bot-auth ve web-bot-auth-detected kontrolleri sitenizin bunu hem doğrulayabildiğini hem de spoofing'i fark ettiğini test ediyor.

Bağlam: AIDE bu kontrolde tam olarak neye bakıyor?

bots-web-bot-auth üç sondaj yapar:

  1. Sitenize bilinen bir bot UA + valid signature ile istek geldiğinde 200 dönüyor mu?
  2. Aynı UA + invalid signature ile istek geldiğinde 403/blocked dönüyor mu?
  3. Cloudflare directory'de listelenen bot için key fetch çalışıyor mu?

web-bot-auth-detected ise sitenin bu mekanizmayı kullandığını (sadece pas geçtiğini değil) doğrular — yani gerçek bir Cache-Control veya logging davranışı bot signature'ına göre değişiyor mu?

Tahsis: bot signature nasıl görünüyor?

Cloudflare bot networkü (Googlebot 2.0, ChatGPT-User, ClaudeBot v2 vb.) HTTP isteğine 4 header ekliyor:

GET /robots.txt HTTP/2
Host: aide.tr
User-Agent: ClaudeBot/1.0
Signature-Agent: claude-bot
Signature-Input: sig1=("@authority" "@method" "@target-uri" "signature-agent");created=1735689600;keyid="cloudflare-claude-1";alg="ed25519"
Signature: sig1=:abc123...:

Dört kritik alan:

| Alan | Anlam | |---|---| | Signature-Agent | Hangi bot — Cloudflare directory'deki kayıtlı isim | | Signature-Input | Hangi parça imzalandı (method, URI, vb.) ve hangi key ile | | Signature | Ed25519 imzası (base64) | | User-Agent | Cosmetic — gerçek kimlik Signature-Agent üzerinden |

Sunucu tarafında doğrulama

Python'da http-message-signatures paketi ile:

# bot_verifier.py
import httpx
from http_message_signatures import HTTPMessageVerifier, algorithms
from http_message_signatures.resolvers import HTTPSignatureKeyResolver
import base64
from nacl.signing import VerifyKey


CF_DIRECTORY = "https://radar.cloudflare.com/api/v1/bot-management/keys"


class CloudflareKeyResolver(HTTPSignatureKeyResolver):
    """Cloudflare bot directory'den public key fetch eder."""

    async def resolve_public_key(self, key_id: str):
        async with httpx.AsyncClient() as client:
            resp = await client.get(f"{CF_DIRECTORY}/{key_id}")
            resp.raise_for_status()
            key_pem = resp.json()["public_key"]
        return VerifyKey(base64.b64decode(key_pem))


async def verify_bot(request) -> str | None:
    """Doğrulanmış bot ise signature_agent dön, yoksa None."""
    if "Signature" not in request.headers:
        return None

    verifier = HTTPMessageVerifier(
        signature_algorithm=algorithms.ED25519,
        key_resolver=CloudflareKeyResolver(),
    )
    try:
        await verifier.verify(request)
    except Exception:
        return None

    return request.headers.get("Signature-Agent")

Çağıran:

from fastapi import FastAPI, Request

app = FastAPI()

@app.middleware("http")
async def bot_auth_middleware(request: Request, call_next):
    bot_name = await verify_bot(request)
    request.state.verified_bot = bot_name
    return await call_next(request)


@app.get("/")
async def root(request: Request):
    if request.state.verified_bot:
        return {"hello": f"verified bot {request.state.verified_bot}"}
    return {"hello": "browser"}

Doğrulanmış bot'a ne yapmalı?

Pas geçmek yetmezweb-bot-auth-detected kontrolü davranış farklılığı arar:

  • Rate limit yumuşatma: Doğrulanmış bot daha yüksek QPS sınırına sahip
  • Cache header'ları: Bot için Cache-Control: public, max-age=300 agresif; tarayıcı için strict
  • Logging: bot_traffic ayrı bir tabloya gidiyor (analitik kirliliği önlemek için)
  • Robots.txt override: Bot zaten doğrulanmışsa, robots.txt restriction'larını yumuşatabilirsiniz

Örnek:

@app.get("/articles/{slug}")
async def article(slug: str, request: Request):
    bot = request.state.verified_bot
    response = JSONResponse(load_article(slug))

    if bot in ("googlebot", "claude-bot"):
        # Doğrulanmış crawler'a tam içerik + agresif cache
        response.headers["Cache-Control"] = "public, max-age=86400"
        response.headers["X-Bot-Allowed"] = bot
    elif bot:
        # Doğrulanmış ama whitelist'te değil
        response.headers["Cache-Control"] = "public, max-age=300"
    else:
        # İnsan veya doğrulanmamış
        response.headers["Cache-Control"] = "private, max-age=60"

    return response

Yaygın hatalar

| Hata | Belirti | Çözüm | |---|---|---| | Sadece UA kontrolü, signature yok | AIDE WARNING — "User-Agent spoofing tespit edilemiyor" | UA + signature kombinasyonunu birlikte doğrula | | Key fetch her istekte network round-trip | Latency >500ms | Public key'leri 24 saat cache'le (pubkey rotasyonu nadir) | | created timestamp kontrolü yok | Replay attack mümkün | created ile şimdi arası ≤300sn olmalı | | Doğrulanmamış botlara da yumuşak rate limit | Spoofer adminlerinizin trafiğini ezebilir | Default'u strict tut, sadece valid signature olanlara loose ver |

Cloudflare olmadan kendi key directory

Kendi botunuzu yayınlamak istiyorsanız — örneğin AIDE'nin kendi tarama bot'u:

# Public key'i well-known'da yayınla
# /.well-known/http-message-signatures/keys/aide-bot-1.json
{
  "kty": "OKP",
  "crv": "Ed25519",
  "x": "ABC123...base64...",
  "kid": "aide-bot-1",
  "alg": "EdDSA"
}

Sonra Cloudflare directory submission:

curl -X POST https://radar.cloudflare.com/api/v1/bot-submissions \
  -H "Authorization: Bearer $CF_API_TOKEN" \
  -d '{
    "name": "AIDE Scan Bot",
    "agent_string": "AIDEScanBot/1.0",
    "key_url": "https://aide.tr/.well-known/http-message-signatures/keys/aide-bot-1.json",
    "purpose": "compliance auditing",
    "rate_limit": "10rps"
  }'

Manuel review (~2 hafta) sonrası directory'ye eklenirsiniz; AIDE-doğrulayan siteler bot trafiğinizi guarantilendiği için yüksek QPS'a izin verir.

Test: AIDE'nin yaptığı şey

Manuel olarak bir bot signature gönderin:

# Geçerli signature — Cloudflare'in test key'i ile
curl -i https://siteniz.com/ \
  -H 'User-Agent: ClaudeBot/1.0' \
  -H 'Signature-Agent: claude-bot' \
  -H 'Signature-Input: sig1=("@authority");created=1735689600;keyid="cloudflare-claude-1";alg="ed25519"' \
  -H 'Signature: sig1=:VALID_BASE64_SIG:'

Beklenti: 200 + bot-yumuşatılmış cache header.

# Geçersiz signature — bozuk imza
curl -i https://siteniz.com/ \
  -H 'User-Agent: ClaudeBot/1.0' \
  -H 'Signature: sig1=:CORRUPTED:'

Beklenti: 403 veya tarayıcı-strict header'ları.

İkisi de doğru çalışıyorsa AIDE taramasında bots-web-bot-auth PASS gelir.

Production için

  • Key rotation: Public key'leri 90 günde bir rotate edin. Eski key ID'ler 30 gün geçerli kalmalı (bot'lar cache'lemiş olabilir).
  • Failure mode: Cloudflare directory down olduğunda? Ya graceful degrade (bot olarak davranma, tarayıcı varsay) ya da cached key kullan. Asla 5xx atma.
  • Telemetri: bot_signature_invalid_total ve bot_signature_valid_total metriklerini Prometheus'a yazın — saldırıyı erken yakalarsınız.

İlgili kaynaklar

1284 abone

Haftalık AI-Readiness bülteni

Yeni makaleler, sektör trendi, kontrol değişiklikleri — haftada bir mail.

Sitenizde deneyin

Tek bir tıklamayla bu kontrolü çalıştırın.

Hangi kontrolü istersin?
Web Bot Auth: HTTP Message Signatures ile Ajan Kimliği | AIDE