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:
- Sitenize bilinen bir bot UA + valid signature ile istek geldiğinde 200 dönüyor mu?
- Aynı UA + invalid signature ile istek geldiğinde 403/blocked dönüyor mu?
- 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 yetmez — web-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=300agresif; tarayıcı için strict - Logging:
bot_trafficayrı 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_totalvebot_signature_valid_totalmetriklerini Prometheus'a yazın — saldırıyı erken yakalarsınız.
İlgili kaynaklar
- RFC 9421 — HTTP Message Signatures
- Cloudflare Web Bot Auth
- Cloudflare Bot Directory
- http-message-signatures (Python)
- AIDE check detayları:
/learn/bots-web-bot-auth,/learn/web-bot-auth-detected - Bot listesi referansı:
/learn/ai-botlari-listesi-2026