Cloaking nasıl çalışır ve nasıl tespit edilir?

Cloaking, arama motoruna bir içerik, kullanıcıya başka bir içerik göstermek demek. Google'ın spam politikalarında en eski ve en net yasaklardan biri. Ama benim karşılaştığım vakaların çoğunda cloaking'i site sahibi yapmıyor; sitesi hacklenmiş ve saldırgan Googlebot'a bahis ya da ilaç spam'i gösterirken site sahibi tarayıcısında her şeyi normal görüyor.

Bu yüzden konuyu tespit tarafından ele alıyorum: cloaking ve sinsi yönlendirmeler kavramsal olarak nasıl çalışır, hangi farklar meşrudur ve kendi sitenizde bunu nasıl kontrol edersiniz.

Cloaking ve sinsi yönlendirme nedir?

Cloaking'de sunucu, isteği kimin yaptığına bakıp farklı yanıt verir. Ayrım genellikle iki şeye dayanır:

  • User-agent: İstekteki tarayıcı kimliği "Googlebot" içeriyorsa farklı HTML döner.
  • IP adresi: İstek Google'ın bilinen IP aralıklarından geliyorsa farklı HTML döner. Bu tür daha sinsidir, çünkü user-agent'ı değiştirerek görülemez.

Sinsi yönlendirme (sneaky redirect) ise kullanıcıyı, Google'ın gördüğü sayfadan farklı bir yere göndermek. Tipik örnekler:

  • Sadece mobil cihazdan gelen kullanıcıyı spam bir siteye yönlendiren JavaScript.
  • Sadece Google arama sonucundan gelen ziyaretçiyi (referer'ı google olanları) yönlendiren kod. Siteye adres çubuğundan giren site sahibi hiçbir şey görmez.
  • Googlebot'a normal sayfa, kullanıcıya yönlendirme gösteren kombinasyonlar.

Google bu ikisini birlikte değerlendiriyor ve Search Console'da cloaking ve/veya sinsi yönlendirmeler (Cloaking and/or sneaky redirects) adında bir manuel işlem türü var.

Cloaking olmayan farklar

Her farklı yanıt cloaking değil. Kural şu: Googlebot'a gösterdiğiniz şey, aynı koşullardaki bir kullanıcıya gösterdiğinizle özünde aynı olmalı. Aşağıdakiler meşru:

  • Ödeme duvarı (paywall): Abonelik içeriğinin tamamını Googlebot'a gösterip kullanıcıya sadece bir kısmını göstermek, Google'ın abonelik ve ödeme duvarlı içerik için belgelediği yapılandırılmış veri kullanıldığında cloaking sayılmıyor. İçeriğin ödeme duvarlı olduğunu isAccessibleForFree ve kapalı bölümü işaret eden hasPart ile belirtiyorsunuz.
  • Coğrafi kişiselleştirme: Türkiye'den gelene TL, Almanya'dan gelene euro fiyat göstermek. Googlebot'a, onun geldiği konumdaki bir kullanıcıya ne gösteriyorsanız onu göstermeniz yeterli; Googlebot'u özel olarak ayırmıyorsunuz.
  • Dinamik sunum (dynamic serving): Aynı URL'de mobil ve masaüstüne farklı HTML vermek. Burada Vary: User-Agent başlığını göndermeniz öneriliyor. İçerik aynı, sadece şablon farklı.
  • Sahte Googlebot'u engellemek: Birçok güvenlik eklentisi, Googlebot user-agent'ı taşıyan ama ters DNS doğrulamasından geçemeyen istekleri engeller. Aşağıdaki testte curl ile yaptığınız "Googlebot" isteği 403 alıyorsa bu cloaking değil, sahte bot korumasıdır.

Tespit 1: user-agent ve referer karşılaştırması

İlk kontrol basit: aynı URL'yi normal tarayıcı kimliğiyle, Googlebot kimliğiyle ve Google'dan geliyormuş gibi referer ile isteyip yanıtları karşılaştırmak.

cloaking-kontrol.sh
#!/usr/bin/env bash
# Kullanım: ./cloaking-kontrol.sh https://ornek.com/sayfa
set -u
URL="$1"
KLASOR=$(mktemp -d)

TARAYICI_UA="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
MOBIL_UA="Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Mobile Safari/537.36"
GOOGLEBOT_UA="Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

# İstek atıp durum kodu ve son URL'yi yazdıran yardımcı fonksiyon
iste() {
  local ad="$1" ua="$2" ref="$3"
  curl -s -L --max-time 20 -A "$ua" ${ref:+-e "$ref"} \
    -o "$KLASOR/$ad.html" \
    -w "$ad: HTTP %{http_code} -> %{url_effective}\n" "$URL"
}

iste tarayici "$TARAYICI_UA" ""
iste googlebot "$GOOGLEBOT_UA" ""
iste mobil_google "$MOBIL_UA" "https://www.google.com/"
iste tarayici_google "$TARAYICI_UA" "https://www.google.com/"

echo "--- Boyutlar (byte) ---"
wc -c "$KLASOR"/*.html

echo "--- Başlık etiketleri ---"
for f in "$KLASOR"/*.html; do
  baslik=$(grep -o -i '<title>[^<]*</title>' "$f" | head -1)
  echo "$(basename "$f"): $baslik"
done

echo "--- Şüpheli kelimeler ---"
grep -o -i -E 'bahis|casino|deneme bonusu|slot|viagra' "$KLASOR"/*.html | sort | uniq -c

echo "--- Tarayıcı ve Googlebot farkı (ilk 40 satır) ---"
diff <(sed 's/></>\n</g' "$KLASOR/tarayici.html") \
     <(sed 's/></>\n</g' "$KLASOR/googlebot.html") | head -40

echo "Dosyalar: $KLASOR"

Çıktıyı okurken dikkat ettiğim şeyler:

  • Farklı son URL: Mobil ya da Google referer'lı istek başka bir domaine gidiyorsa bu açık bir sinsi yönlendirme işareti.
  • Farklı <title>: Tarayıcıda "Kurumsal Hizmetler", Googlebot'ta bahis başlığı görüyorsanız cevap belli.
  • Boyut farkı: Birkaç yüz byte fark normaldir (nonce, CSRF token, zaman damgası). Birkaç kat fark incelemeye değer.
  • Şüpheli kelimeler: Sadece Googlebot dosyasında çıkıyorsa, bu hacklenmiş sitelerin klasik tablosu.

diff çıktısı dinamik sitelerde gürültülü olabilir; ben önce başlığa, boyuta ve kelime sayımına bakıyorum, diff'e sadece bir şüphe varsa geçiyorum. Tek bir sayfanın ham HTML'ini hızlıca incelemek için kaynak kod analiz aracını da kullanabilirsiniz.

Yönlendirme JavaScript ile yapılıyorsa curl bunu takip etmez, çünkü JavaScript çalıştırmaz. Bu durumda HTML içinde window.location, document.referrer ya da navigator.userAgent geçen, özellikle base64 veya eval ile gizlenmiş kod parçalarını aramak gerekiyor. Ham HTML ile render edilmiş DOM arasındaki farkı yakalamak için render farkı testi yazısındaki yöntem işe yarar.

Tespit 2: URL Denetimi, en güvenilir test

User-agent testinin bir sınırı var: IP tabanlı cloaking bunu atlatır. Sunucu isteğin Google'ın IP aralığından gelip gelmediğine bakıyorsa, sizin bilgisayarınızdan gönderdiğiniz "Googlebot" isteği sıradan bir kullanıcı gibi karşılanır ve temiz sayfa döner.

Bu yüzden asıl test Search Console'daki URL Denetimi (URL Inspection):

  1. Şüphelendiğiniz URL'yi denetleyin.
  2. Taranan sayfayı görüntüle (View crawled page) ile Google'ın en son taradığı HTML'e bakın.
  3. Canlı URL'yi test et (Test live URL) ile şu anki durumu gerçek Google altyapısından isteyin, sonra yine HTML'i ve ekran görüntüsünü inceleyin.

Bu istekler gerçek Google IP'lerinden geldiği için IP tabanlı cloaking de burada görünür. HTML sekmesinde "Ctrl+F" ile bahis, casino gibi kelimeleri aramak birkaç saniye sürer.

Ek bir kontrol olarak Google'da site:alanadiniz.com bahis gibi aramalar yapın. Kendi alan adınızda, yazmadığınız bir konuda sonuç çıkıyorsa, bu sayfalar Google'a bir şekilde servis edilmiş demektir.

Gerçek dünyadaki en yaygın vaka

Benim gördüğüm cloaking vakalarının büyük çoğunluğu aynı hikâye: site hacklenmiş, saldırgan temaya, bir eklentiye ya da .htaccess dosyasına kod yerleştirmiş, bu kod sadece Googlebot'a ya da Google'dan gelen ziyaretçiye spam gösteriyor. Site sahibi ve çalışanlar siteye doğrudan girdikleri için hiçbir şey fark etmiyor. Sorun, Search Console'da bir güvenlik uyarısı ya da garip arama sonuçlarıyla ortaya çıkıyor.

Enjekte edilmiş gizli linkleri dosya ve veritabanı seviyesinde nasıl arayacağınızı gizli bahis linki tespiti yazısında anlattım. Cloaking tespit edildiyse sadece görünen kodu silmek yetmez; arka kapıyı bulup kapatmadan temizlik kalıcı olmaz.

Kontrol listesi

  • Önemli sayfaları normal, mobil, Googlebot ve Google referer'lı isteklerle karşılaştırdım.
  • Başlık, boyut ve son URL farklarını inceledim; nonce gibi doğal farkları ayırdım.
  • Googlebot isteğine 403 dönüyorsa bunun sahte bot koruması olup olmadığını kontrol ettim.
  • URL Denetimi'nde taranan sayfanın ve canlı testin HTML'ine baktım.
  • site: aramasıyla kendi alan adımda yazmadığım konuları aradım.
  • Meşru farklar (paywall, coğrafi fiyat, dinamik sunum) doğru işaretlenmiş durumda.
  • Şüphe varsa Search Console'da Güvenlik sorunları (Security issues) ve Manuel işlemler (Manual actions) raporlarını kontrol ettim.

Comments / questions

If you have a question about any topic or wish to contact me: Telegram or send an email to [email protected] Thanks!

Related pages