Kasada (eski adıyla Pree), son yıllarda en sofistike anti-bot platformlarından biri haline geldi. 2026 itibarıyla, e-ticaret, bilet satışı ve finansal hizmetler sitelerinde otomasyon çalıştıran mühendisler için en büyük engellerden birini oluşturuyor. Bu rehberde Kasada anti-bot açıklaması yapıyoruz: ips.js bytecode VM, x-kpsdk-ct başlık ailesi, JA3/JA4 TLS parmak izi ve IP itibar puanlamasının nasıl çalıştığını teknik derinlikte inceliyor, ardından yasal otomasyon senaryoları için ProxyHat residential proxy'lerle nasıl temiz geçiş yapılacağını gösteriyoruz.
Kasada Anti-Bot Açıklaması: Sistem Mimarisi
Kasada'nın koruma katmanı üç ana bileşenden oluşur: bir JavaScript meydan okuma scripti (ips.js), bir kalıcı çerez (KP_UIDz) ve istemci tarafından gönderilen bir başlık ailesi (x-kpsdk-ct, x-kpsdk-cd, x-kpsdk-dv). Bu bileşenler birlikte çalışarak tarayıcı bütünlüğünü, cihaz parmak izini ve oturum sürekliliğini doğrular.
ips.js: ~449KB'lık Bytecode Sanal Makinesi
Kasada'nın kalbinde ips.js adlı script bulunur. Bu script yaklaşık 449KB boyutundadır ve içinde özel bir bytecode sanal makinesi (VM) barındırır. VM, standart JavaScript yerine kendi opcode setini çalıştırır; bu sayede tersine mühendislik yapan kişiler için kodu okumak ve anlamak son derece zorlaşır. Script şu özelliklere sahiptir:
- Kodlanmış string tablosu: Tüm metinler (API uç noktaları, DOM seçiciler, kontrol değerleri) XOR veya benzeri bir şifreleme ile saklanır. Çalışma zamanında dinamik olarak çözülür.
- Zaman tabanlı tohumlar (time-based seeds): VM,
performance.now()veDate.now()değerlerini kullanarak her oturumda farklı bir başlangıç durumu üretir. Bu, replay saldırılarını engeller. - Bütünlük kontrol toplamları: Script, kendi kaynak kodunun hash'ini hesaplar ve sunucuya gönderir. Eğer script değiştirilmiş veya enjekte edilmişse, hash uyuşmaz ve istek reddedilir.
VM çalıştığında, tarayıcı ve cihaz hakkında kapsamlı bir parmak izi toplar: navigator özellikleri (userAgent, platform, language, hardwareConcurrency, deviceMemory), screen boyutları ve renk derinliği, WebGL renderer bilgisi (WEBGL_debug_renderer_info uzantısı üzerinden), Canvas API parmak izi, AudioContext parmak izi, yüklü fontlar ve Intl.DateTimeFormat().resolvedOptions().timeZone çıktısı. Bu veriler şifrelenip x-kpsdk-ct başlığında sunucuya gönderilir.
KP_UIDz Çerezi ve Oturum Sürekliliği
Kasada, başarılı bir meydan okuma sonrasında KP_UIDz adlı bir çerez set eder. Bu çerez, sonraki isteklerde tarayıcı tarafından otomatik olarak gönderilir ve Kasada'ya kullanıcının daha önce doğrulandığını gösterir. KP_UIDz çerezi olmadan yapılan istekler, yeni bir meydan okamaya tabi tutulur.
KP_UIDzçerezi, Kasada'nın "güvenilir istemci" modelinin temelidir. Bu çerezi çoğaltmak veya taklit etmek, çerezin içeriğinin sunucu tarafında şifreli olarak doğrulanması nedeniyle pratik değildir. Çerezin geçerli olması içinips.js'in gerçek bir tarayıcıda çalışmış olması gerekir.
x-kpsdk-ct / x-kpsdk-cd / x-kpsdk-dv Başlık Ailesi
Kasada korumalı bir API'ye yapılan her istekte, tarayıcı şu üç başlığı gönderir:
| Başlık | İşlev | Başarısızlık Durumunda Yanıt |
|---|---|---|
x-kpsdk-ct |
Challenge token — VM tarafından üretilen şifreli payload | 429 (geçersiz/süresi dolmuş) |
x-kpsdk-cd |
Challenge data — cihaz ve tarayıcı parmak izi verisi | 403 (uyumsuz parmak izi) |
x-kpsdk-dv |
Device verification — ek cihaz doğrulama imzası | 403 (uyumsuz cihaz) |
Bu başlıkların değerleri her istekte döner — Kasada, replay saldırılarını önlemek için token'ları kısa süreli tutar. Bir 429 yanıtı alıp yanıt başlığında x-kpsdk-ct varsa, bu, token'ın geçersiz veya süresi dolmuş olduğu anlamına gelir; yeni bir ips.js meydan okamasının çalıştırılması gerekir.
TLS ve HTTP/2 Parmak İzi: JA3/JA4 ve IP İtibar Puanlaması
Kasada, JavaScript meydan okumasını çalıştırmadan önce, bağlantı katmanında iki önemli kontrol yapar: TLS parmak izi (JA3/JA4) ve HTTP/2 bağlantı parmak izi. Bu katmanlar, botların ips.js'i hiç çalıştırmadan engellenmesini sağlar. kasada bypass stratejisi geliştirirken bu katmanları atlamak en kritik adımdır.
JA3 ve JA4: TLS El Sıkışma Parmak İzi
JA3, TLS el sıkışması sırasında istemcinin gönderdiği ClientHello mesajından türetilen bir parmak izidir. TLS sürümü, desteklenen cipher listesi, extensions listesi ve elliptic curves listesinin MD5 hash'ini alır. JA4 ise benzer bir yaklaşımla daha yapısal bir parmak izi üretir ve sıralı cipher listesini de hesaba katar.
Kasada, bilinen bot kütüphanelerinin (Python requests, httpx, Node.js axios, Go net/http) JA3/JA4 imzalarını bir veritabanında tutar. Örneğin, Python requests kütüphanesi genellikle OpenSSL'ın varsayılan cipher sıralamasını kullanır; bu sıralama, gerçek Chrome veya Firefox tarayıcılarının cipher sıralamasından farklıdır. Kasada bu farkı tespit edebilir.
Gerçek bir Chrome 131 tarayıcısı, TLS el sıkışmasında şu cipher'ları şu sırayla sunar (ilk birkaçı):
TLS_AES_128_GCM_SHA256,
TLS_AES_256_GCM_SHA384,
TLS_CHACHA20_POLY1305_SHA256,
TLS_AES_128_CCM_SHA256,
ECDHE-ECDSA-AES128-GCM-SHA256,
ECDHE-RSA-AES128-GCM-SHA256, ...
Bir Python urllib3 istemcisi ise farklı bir sıralama ve extension seti sunar. Örneğin, requests genellikle extension: supported_groups'u Chrome'dan farklı bir sırada gönderir ve GREASE (RFC 8701) değerlerini içermez. Kasada bu uyuşmazlığı bir "bot sinyali" olarak değerlendirir.
HTTP/2 Parmak İzi
RFC 7540 ile tanımlanan HTTP/2 protokolü, istemcilerin SETTINGS frame'lerini ve header öncelik (priority) kurallarını farklı şekilde yapılandırmasına izin verir. Kasada, bu yapılandırmayı da parmak izi olarak kullanır:
- SETTINGS frame değerleri:
HEADER_TABLE_SIZE,ENABLE_PUSH,INITIAL_WINDOW_SIZEgibi parametrelerin değerleri ve sırası tarayıcıya özeldir. Chrome,INITIAL_WINDOW_SIZE'ı 65535 olarak ayarlarken Firefox 131072 kullanır. - Header priority: Chrome ve Firefox, HTTP/2 isteklerinde header önceliklerini farklı şekilde ayarlar. Örneğin Chrome,
:pathpseudo-header'ını yüksek öncelikle gönderirken Firefox farklı bir priority tree kullanır. - Window update davranışı: Tarayıcılar, flow control window'yu farklı zamanlamalarla günceller. Chrome, bağlantı kurulduktan sonra hemen bir WINDOW_UPDATE gönderirken
curlfarklı bir davranış sergiler.
Bu sinyaller birlikte, "HTTP/2 fingerprint" oluşturur. curl veya requests gibi araçlar, gerçek tarayıcıdan farklı bir HTTP/2 imzası üretir. Kasada bu imzayı, JA3/JA4 ile birlikte değerlendirir.
IP İtibar Puanlaması: Datacenter ASN'leri Ön Blokajı
Kasada, JavaScript veya TLS kontrollerine geçmeden önce, istemcinin IP adresini bir itibar skorlamasından geçirir. Bu skorlama şu faktörleri içerir:
- ASN türü: Datacenter ASN'leri (AWS AS14618, GCP AS15169, Azure AS8075, DigitalOcean AS14061, OVH AS16276, Hetzner AS24940 vb.) otomatik olarak düşük itibar alır.
- Coğrafi tutarlılık: IP'nin coğrafi konumu ile tarayıcının
Accept-Languagebaşlığı veIntl.DateTimeFormatzaman dilimi ayarlarının uyumu kontrol edilir. - Tarihsel davranış: Aynı IP'den daha önce şüpheli istekler gelip gelmediği. Kasada, IP'leri bir 30 günlük davranış penceri üzerinden değerlendirir.
- Proxy tespiti: IP'nin bilinen proxy/VPN veritabanlarında olup olmadığı. Datacenter IP'leri neredeyse her zaman bu listede bulunur.
Kasada, datacenter IP'lerini genellikle meydan okamaya gerek bile duymadan reddeder veya 429 ile yanıtlar. Bu, ips.js'i hiç çalıştırmadan bile botların engellenmesini sağlar. ips.js kasada meydan okamasına ulaşmak için önce bu IP katmanından geçmek gerekir.
Kasada Bypass: Residential Proxy Neden Zorunlu?
Kasada'nın IP itibar puanlaması, datacenter proxy'leri neredeyle tamamen işlevsiz kılar. Bir AWS veya DigitalOcean IP'si üzerinden gelen istek, en mükemmel TLS parmak izine ve geçerli bir KP_UIDz çerezine sahip olsa bile, düşük IP itibarı nedeniyle engellenebilir.
| Proxy Türü | Kasada Geçiş Oranı (Tahmini) | Ortalama Gecikme | Kasada Uygunluğu |
|---|---|---|---|
| Datacenter | %5–15 | ~50ms | Çoğu durumda işlevsiz |
| Residential | %70–90 | ~200ms | En iyi denge |
| Mobile (4G/5G) | %85–95 | ~300–500ms | En yüksek geçiş, yüksek maliyet |
Residential proxy'ler, gerçek ISP'lere (AT&T, Comcast, Vodafone, Türk Telekom, Deutsche Telekom vb.) kayıtlı IP'ler kullandığı için, Kasada'nın ASN kontrolünden yüksek itibar puanıyla geçer. Bu, ips.js meydan okamasının çalışmasına ve geçerli bir KP_UIDz üretilmesine olanak tanır.
ProxyHat'ın residential proxy ağı, 100+ ülkede gerçek ISP IP'leri sunar. Fiyatlandırma sayfamızda residential paketlerin detaylarını inceleyebilirsiniz.
ProxyHat ile Yasal Otomasyon: Çalışan Bir Yaklaşım
Kasada'yı geçmenin tek sağlam yolu, gerçek bir tarayıcı çalışma zamanı (browser runtime) ile residential proxy'yi birleştirmektir. Bu yaklaşımda, ips.js gerçek bir tarayıcıda çalışır, KP_UIDz çerezi normal şekilde set edilir ve tüm başlıklar (x-kpsdk-ct, x-kpsdk-cd, x-kpsdk-dv) tarayıcı tarafından otomatik olarak gönderilir. Aşağıdaki örneklerde ProxyHat'ın SOCKS5 proxy'sini (gate.proxyhat.com:1080) kullanıyoruz.
Adım 1: ProxyHat SOCKS5 Bağlantısı
# SOCKS5 proxy URL formatı
socks5://USERNAME:PASSWORD@gate.proxyhat.com:1080
# Ülke bazlı geo-targeting
socks5://user-country-US:pass@gate.proxyhat.com:1080
# Şehir bazlı geo-targeting
socks5://user-country-DE-city-berlin:pass@gate.proxyhat.com:1080
# Sticky session (aynı IP'yi korumak için)
socks5://user-session-abc123:pass@gate.proxyhat.com:1080
Adım 2: Python + Playwright ile Gerçek Tarayıcı
from playwright.sync_api import sync_playwright
import random, time
PROXY = "socks5://user-country-US:pass@gate.proxyhat.com:1080"
def scrape_with_kasada(url):
with sync_playwright() as p:
browser = p.chromium.launch(
headless=True,
proxy={"server": PROXY}
)
context = browser.new_context(
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/131.0.0.0 Safari/537.36",
viewport={"width": 1920, "height": 1080},
locale="en-US",
timezone_id="America/New_York"
)
page = context.new_page()
# ips.js'in yüklenmesi ve çalışması için bekle
page.goto(url, wait_until="networkidle", timeout=30000)
# KP_UIDz çerezinin set edilmesini bekle
page.wait_for_timeout(3000)
# Çerezleri kontrol et
cookies = context.cookies()
kp_uidz = [c for c in cookies if c["name"] == "KP_UIDz"]
print(f"KP_UIDz mevcut: {bool(kp_uidz)}")
# İnsan benzeri gecikme
time.sleep(random.uniform(2, 5))
# Sayfa içeriğini al
content = page.content()
print(f"Sayfa yüklendi, uzunluk: {len(content)}")
browser.close()
return content
scrape_with_kasada("https://hedef-site.com/")
Bu yaklaşımda dikkat edilmesi gerekenler:
- Sticky session kullanın:
ips.jsçalışıpKP_UIDzüretildikten sonra, aynı IP'den gelen istekler tutarlı olmalıdır. ProxyHat'tauser-session-{id}formatıyla sticky session oluşturun. - Geo-tutarlılık: Proxy IP'si ABD'deyse, tarayıcının dil (
locale="en-US") ve zaman dilimi (timezone_id="America/New_York") de ABD ile uyumlu olmalıdır. Almanya IP'si ileen-USlocale kullanmak, Kasada'nın coğrafi tutarlılık kontrolünde işaretlenir. - Headless tespiti: Playwright'ın headless modu,
navigator.webdriverözelliğinitrueolarak bırakabilir. Kasada bu özelliği kontrol eder.playwright-stealthveya benzeri bir plugin kullanmayı düşünün. - Viewport tutarlılığı:
screen.widthvewindow.innerWidthdeğerleri uyumlu olmalıdır.innerWidth1920 ikenscreen.width1366 ise bu bir tutarsızlıktır.
Adım 3: Node.js + Puppeteer Örneği
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());
(async () => {
const browser = await puppeteer.launch({
headless: 'new',
args: [
'--proxy-server=socks5://user-country-US:pass@gate.proxyhat.com:1080'
]
});
const page = await browser.newPage();
await page.setUserAgent(
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ' +
'AppleWebKit/537.36 (KHTML, like Gecko) ' +
'Chrome/131.0.0.0 Safari/537.36'
);
await page.setViewport({ width: 1920, height: 1080 });
await page.goto('https://hedef-site.com/', {
waitUntil: 'networkidle2',
timeout: 30000
});
// KP_UIDz çerezini kontrol et
const cookies = await page.cookies();
const kpUidz = cookies.find(c => c.name === 'KP_UIDz');
console.log('KP_UIDz mevcut:', !!kpUidz);
// x-kpsdk-ct başlığını yakala
page.on('request', req => {
const ct = req.headers()['x-kpsdk-ct'];
if (ct) console.log('x-kpsdk-ct uzunluk:', ct.length);
});
await browser.close();
})();
Adım 4: curl ile IP İtibar Testi
# SOCKS5 proxy ile curl testi (sadece IP itibarını test eder)
curl -x socks5://user-country-US:pass@gate.proxyhat.com:1080 \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) " \
-H "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36" \
-H "Accept: text/html,application/xhtml+xml" \
-H "Accept-Language: en-US,en;q=0.9" \
-w "\n%{http_code} %{time_total}s\n" \
"https://hedef-site.com/"
Not: curl, ips.js'i çalıştıramaz ve KP_UIDz üretemez. Yukarıdaki örnek yalnızca IP itibarının ve temel HTTP başlıklarının test edilmesi içindir. Kasada korumalı sayfalar için gerçek bir tarayıcı runtime'ı zorunludur.
Yaygın Hatalar ve Sınır Durumları
1. Token Süresi Dolması
x-kpsdk-ct token'ı kısa sürelidir (genellikle 5–10 dakika). Uzun süredir açık kalan bir tarayıcı oturumunda, token süresi dolduğunda 429 alırsınız. Çözüm: periyodik olarak sayfayı yenilemek veya yeni bir meydan okama başlatmak. page.reload() çağrısı, ips.js'in yeniden çalışmasını tetikler ve yeni bir token üretilmesini sağlar.
2. Çerez Senkronizasyonu
Sticky session kullanmıyorsanız, her istekte IP değişir. Farklı bir IP'den KP_UIDz çerezi göndermek, Kasada'nın oturum tutarlılık kontrolünden geçemez. user-session-{id} ile en az 10–15 dakika boyunca aynı IP'yi koruyun. ProxyHat'ta sticky session'lar, user-session-myid123 formatında tanımlanır.
3. TLS Uyumsuzluğu
Headless Chrome, gerçek Chrome ile aynı TLS parmak izini üretir — bu büyük bir avantajdır. Ancak, bazı otomasyon araçları (örneğin curl-impersonate veya requests + TLS kütüphanesi), JA3/JA4 imzasını taklit etmeye çalışır. Bu, genellikle başarısız olur çünkü cipher sıralamasını, extension listesini ve GREASE değerlerini tam olarak eşleştirmek zordur. Gerçek tarayıcı kullanmak her zaman daha güvenlidir.
4. Canvas ve WebGL Parmak İzi Tutarsızlığı
Kasada'nın VM'i, Canvas API üzerinden bir parmak izi üretir. Headless tarayıcılarda, GPU rendering davranışı farklı olabilir. Örneğin, headless Chrome bir virtual display kullanıyorsa, WebGLRenderingContext.getParameter() ile alınan renderer bilgisi SwiftShader olabilir — bu, gerçek bir GPU'dan farklıdır. Kasada bu tutarsızlığı tespit edebilir. Çözüm: --use-gl=angle --use-angle=swiftshader yerine gerçek GPU rendering kullanmak veya headful modda çalıştırmak.
5. Behavioral Analiz
Kasada, fare hareketlerini, tıklama hızını ve sayfa kaydırma davranışını da analiz eder. Tamamen otomatik, insan benzeri olmayan davranışlar, geçerli bir KP_UIDz olsa bile zamanla işaretlenebilir. İnsan benzeri gecikmeler eklemek (her istek arasında 2–5 saniye rastgele bekleme) ve gerektiğinde sahte fare hareketleri simüle etmek bu riski azaltır.
Hukuki ve Etik Çerçeve
Bu rehber, yetkili güvenlik testi ve herkese açık veri izleme amaçları için yazılmıştır. Kasada korumalı bir siteyi geçmek, aşağıdaki durumlarda sorunlu olabilir:
- CFAA (ABD): Bir siteye erişim şartlarını (ToS) ihlal etmek, Computer Fraud and Abuse Act kapsamında suç teşkil edebilir. Yetkili penetrasyon testleri bu kapsamın dışındadır, ancak site sahibinin yazılı izni olmalıdır.
- GDPR (AB): Kişisel veri topluyorsanız, veri öznesinin rızası ve GDPR'ın 6. Maddesi gereklidir. Herkese açık veri izleme, kişisel veri içermiyorsa genellikle daha az risklidir, ancak yine de hukuki danışman alın.
- Sahtekarlık: Bu rehber, sahtekarlık (kredi kartı testi, hesap ele geçirme, sahte kayıt oluşturma, stok manipülasyonu) amaçlarıyla kullanılamaz. ProxyHat, hizmetlerini yalnızca yasal amaçlarla kullanmanızı şart koşar.
Web scraping use case sayfamızda yasal ve etik scraping için daha fazla bilgi bulabilirsiniz. Ayrıca SERP tracking için ProxyHat kullanımı hakkında da rehberimiz mevcuttur. Teknik dokümantasyon için ProxyHat Docs'a bakabilirsiniz.
Önemli Çıkarımlar
- Kasada,
ips.jsbytecode VM, TLS/HTTP2 parmak izi ve IP itibar puanlamasını birlikte kullanır — tek bir katmanı geçmek yeterli değildir.- Datacenter IP'leri Kasada tarafından ön blokajlanır; residential proxy'ler zorunludur.
x-kpsdk-ctile 429 almak, token'ın geçersiz veya süresi dolmuş olduğu anlamına gelir;ips.js'in yeniden çalıştırılması gerekir.- Gerçek bir tarayıcı runtime'ı (Playwright/Puppeteer) + ProxyHat SOCKS5 residential proxy, en sağlam yaklaşımdır.
- Sticky session kullanın, geo-tutarlılığı koruyun ve insan benzeri davranış gecikmeleri ekleyin.
- Sadece yetkili test ve herkese açık veri izleme için kullanın — CFAA ve GDPR'a uyun.






