4 puan yazan GN⁺ 2025-11-17 | 1 yorum | WhatsApp'ta paylaş
  • Herkese açık web sitelerine aşırı istek göndererek DDoS gibi davranan scraper botlar sorununu ele alıyor ve bunu tersine çevirip onların zamanını boşa harcayan deneysel bir yaklaşım sunuyor
  • Markov zinciri tabanlı bir metin üretici oluşturarak .php dosyası gibi görünen sahte veriler üretiyor ve kötü niyetli botların bunları indirmesini sağlıyor
  • Ardından statik içerik sunucusu kurup Frankenstein romanından paragrafları rastgele sunuyor; bağlantı yapısıyla crawler'ların patlayıcı biçimde yayılacağı şekilde tasarlıyor
  • Tüm sayfalara noindex, nofollow öznitelikleri ve istek sayacı ekleyerek normal arama motorlarını dışarıda bırakıyor, yalnızca kuralları çiğneyen botları yakalıyor
  • Deney sonuçları ilgi çekici olsa da Googlebot'u yanlışlıkla yakalama riski nedeniyle bunu gerçek hizmette kullanmıyor; projeyi öğrenme ve deney amaçlı sürdürüyor

Scraper bot sorunu ve karşılık verme fikri

  • Scraper'lar istemeden de olsa küçük ölçekli web sitelerinde DDoS düzeyinde yük oluşturabiliyor
  • Bazı işletmeciler korunma yöntemleri sormuş olsa da bu yazı “savunma değil karşı saldırı” fikrine odaklanıyor
  • Başka bir geliştiricinin Markov zinciriyle sonsuz sahte veri üretip botları kandırdığı örneği görülünce yazar kendi deneyine başlıyor

Markov zinciri tabanlı sahte PHP üreticisi

  • Rust ile Markov zinciri eğiticisi geliştirerek rastgele metin verisine dayalı, gerçekçi görünen içerik üretiyor
  • .env, .aws, .php gibi zafiyet yollarını hedefleyen kötü niyetli botlara, gerçekmiş gibi görünen ama anlamsız PHP kodu sunuyor
  • Dosya boyutunu 2KB'den 10MB'ye çıkararak botların kaynak tüketmesini hedefliyor
  • Örnek çıktı, WordPress fonksiyon adları ve yorumların karıştığı inandırıcı sahte PHP kodu biçiminde
  • Amaç; botların zamanını ve kaynaklarını boşa harcamak, saldırganların da gerçek zafiyet ararken vakit kaybetmesini sağlamak

Verimlilik ve statik veri sunma deneyi

  • VPS üzerinde 1MB'den büyük dosyalar sunulunca yanıt gecikmesi ve sunucu yükü artışı yaşanıyor
  • Bunu çözmek için statik site biçiminde bir “garbage server” kuruluyor
    • Frankenstein romanının tamamı belleğe yükleniyor ve her istekte rastgele 4 paragraf döndürülüyor
    • Her sayfanın altına 5 bağlantı eklenerek patlayıcı tarama yayılımı (5 kat artış) teşvik ediliyor
  • Ortaya çıkan sonuç https://herm.app/babbler/ adresinde görülebilir

Tasarım ayrıntıları ve işletim biçimi

  • Seçilen roman public domain ve Cadılar Bayramı döneminde çalışılmış olmasıyla birlikte yapay zeka ile Frankenstein arasındaki benzerlik nedeniyle kullanılıyor
  • Tüm sayfalara noindex,nofollow eklenerek yalnızca kuralları ihlal eden botlar yakalanıyor
  • Her sayfanın altında istek sayısı sayacı gösteriliyor; bellek tabanlı olduğu için dağıtımdan sonra sıfırlanıyor
  • .php istekleri için ayrı bir sunucu da kuruluyor; gerçek PHP dosyaları bellekte rastgele sunuluyor
  • Proje, “Garbage for the garbage king!” sözüyle özetleniyor

Riskler ve sınırlamalar

  • Bu sistem gerçek hizmette uygulanırsa arama motorlarını yanlışlıkla yakalama riski taşıyor
    • Googlebot yanlış endpoint'leri tararsa site spam site olarak sınıflandırılabilir
    • Bu da arama görünürlüğünün düşmesine veya Chrome uyarıları gösterilmesine yol açabilir
  • Bu nedenle aramaya bağımlı siteler için önerilmiyor; yalnızca deneysel proje olarak işletiliyor
  • .php için olan babbler HTML olmadığı için Googlebot üzerinde etkisi yok; yalnızca kötü niyetli botları hedefliyor

Kapanış ve kişisel sonuç

  • Kötü niyetli scraper'ları çekmek için bloga gizli bağlantılar (rel="nofollow") ekleniyor
  • VPS'nin trafik kotası aşılırsa Cloudflare cache kullanımı değerlendiriliyor
  • Proje sayesinde Markov zincirleri ve botların çalışma mantığı öğrenilirken, eğlenceyle öfkenin karıştığı bir deney yürütülüyor
  • Sonuç olarak her denemenin pratik olması gerekmediği, bazen yalnızca eğlencenin de yeterli olduğu vurgulanıyor

1 yorum

 
GN⁺ 2025-11-17
Hacker News görüşleri
  • Dünya değişse de sonunda benzer sorunlarla karşılaşıyoruz
    10~15 yıl önce sosyal medya izleme servisleri ile uğraşıyordum. Büyük markalar, forumlardaki duygu durumunu izlesinler diye onlara para ödüyordu; onlar da benim işlettiğim ücretsiz topluluğu izinsiz kazıyıp sunucuda yük oluşturuyordu
    Onların botlarını engellesem de IP ve UA değiştirip geri geliyorlardı; ben de gönderilere rastgele marka adları ekleyen bir filtre yapıp veri kalitelerini bozdum. Bu önlemi açtıktan iki gün sonra scraping tamamen durdu

    • Ben de benzer bir şey yaşadım. Sitemdeki bağış formunu kredi kartı testleri için kullanan bir bot vardı; IP değiştirerek durmadan deniyordu. Ben de engellemek yerine başarı/başarısızlık mesajlarını rastgele döndürdüm, verileri kirlendi ve birkaç gün içinde vazgeçtiler
    • Header analizi kısmı gerçekten faydalıydı. Benim Fediverse sunucumda da eski Chrome UA kullanan botların hiç Accept-Language header'ı göndermediğini fark ettim. nginx'te 403 dönecek şekilde ayarlayınca trafik azalmaya başladı
    • The Imitation Game filmindeki gibi, her isteğe anında tepki verirseniz karşı taraf durumu anlar. Yalnızca bazı istekleri işlemek ya da rastgele hata kodları vermek, tespit edilmeyi zorlaştırıp onların debug işini çok daha zor hale getirebilir
    • Botların çoğu hâlâ HTTP header setini düzgün taklit edemiyor. 2025'te bile aynı yöntemle filtreleme yapıyoruz ve botlar hâlâ aynı kalıplarla evriliyor
    • Şirket adları eklenince botların neden kaybolduğunu merak ediyorum. Acaba marka bahsi ararken veri sinyali bozulduğu için mi böyle oldu, bunu sormak isterim
  • Bu botlar PHP dosyalarını gerçekten parse etmiyor; onların varlığı üzerinden zafiyet tespiti için parmak izi (fingerprinting) çıkarıyorlar. Yalnızca yanıt koduna bakıp hemen geçiyorlar

    • Doğru, böyle durumlarda fail2ban veya crowdsec gibi araçlar daha etkili oluyor. crowdsec kullanınca, trafiği düşük sunucularda bile zafiyet tarama girişimlerinin ne kadar fazla olduğunu fark ettim
    • O zaman bilerek sahte zafiyetler gösterip botları cezbetmek de mümkün olabilir. Mesela otomatik botları bir honeypot (honeybot) içine çekip iç işleyişlerini gözlemlemek gibi. Referans: The Cuckoo’s Egg
    • Eğer LLM scraper'ları bu tür yanıtları eğitim verisi olarak kullanıyorsa, veri zehirleme (poisoning) riski büyüyebilir. Son makalelerde de birkaç veri noktasıyla bile modelin bozulabildiği söyleniyordu
  • Yakın zamanda AI ve scraper'lar için tarpit fikrini duydum. Bağlantıyı kapatmadan çok yavaş şekilde sonsuz veri akıtıyorsunuz. Nepenthes adlı araç ilginç geldi, denemek istiyorum

  • Eskiden HN'de scraper engellemek eleştirilirdi. Mantık, “ben nasıl erişirsem erişeyim fark etmez” şeklindeydi

    • Ama artık durum farklı. Bir insanın bireysel olarak erişmesiyle, AI şirketlerinin DDoS seviyesinde toplu istekler göndermesi tamamen ayrı şeyler. İkincisi açıkça maliyeti başkasına yıkmak demek
    • Ben de makul scraping yapılmasına karşı değilim. UA açıkça belirtilir ve robots.txt'ye uyulursa sorun yok. Ama şu anki gibi saniyede onlarca istek gönderip eski Chrome sürümü gibi davranmak kabul edilemez
    • Ben akademik bir proje için günde bir kez iş ilanı sitelerini scrape ediyorum. Bu makul bir kullanım. Buna karşılık içeriği dakikalar içinde çekip götürmek ya da zafiyet aramak bambaşka bir konu
    • AI'nin ortaya çıkışının etik anlayışını zayıflatması en can sıkıcı tarafı. Eskiden özgürlüğü savunan insanlar şimdi telif hakkının daha da sertleşmesini ya da anonimliğin kaldırılmasını istiyor. Teknoloji insanları daha kötü hale getiriyor
  • Apache sunucusunu doğrudan yönetiyorsanız, RewriteEngine ile PHP isteklerini hemen engelleyebilirsiniz

    RewriteEngine On
    RewriteCond %{REQUEST_URI} (\.php|%2ephp|%2e%70%68%70) [NC,OR]
    RewriteCond %{QUERY_STRING} \.php [NC,OR]
    RewriteCond %{THE_REQUEST} \.php [NC]
    RewriteRule .* - [F,L]
    

    Sunucumda PHP yok, dolayısıyla bu tür isteklerin hepsi kötü niyetli

    • nginx'te de benzer şekilde ayarlıyorum. PHP veya ASPX isteklerine HTTP 418 “I'm a teapot” kodu döndürüyorum
      location ~* \.(?:php|aspx?|jsp|dll|sql|bak)$ { return 418; }
      error_page 418 /418.html;
      
      Böylece log filtreleme kolaylaşıyor. Örnek: FreeSolitaire.win/wp-login.php
  • Saldırgan scraper'ların çoğu WordPress zafiyetlerini hedefliyor. PHP dosyasının kendisinden çok onun çıktısını istiyorlar. Bu tarz ayarlar bir tür honeypot gibi ama bot scriptte beklediğini bulamazsa çekip gidiyor

    • Muhtemelen çıktıda regex ile admin login kalıpları arıyorlardır. Bulamazlarsa hemen atlıyorlar. Yani 4KB'lık sahte bir PHP üretmektense tek satırlık bir regex çok daha verimli
  • Bir zamanlar zipbomb stratejisini HN'de paylaşmıştım ve trafik günde 100 bin isteğe fırlamıştı. 6 dolarlık bir VPS bunun altından kalkamadı. Şimdi yalnızca en saldırgan botlara zipbomb veriyorum, geri kalanına 403 dönüyorum. Yeni strateji iyi çalışıyor ama bunu tekrar açık edip etmemek konusunda kararsızım. Referans: önceki yazı

  • Eskiden sadece fail2ban kullanıyordum ama biraz daha eğlenceli bir savunma yöntemi yapmak istedim
    .htaccess içinde şüpheli yolları (/.git, /wp-login) decoy.php'ye yönlendirip 10GB'lık decoy.zip dosyasını zorla indirtiyorum.
    decoy.php, istenen hassas dosya gibi görünüyor ama aslında sahte loglar ve SQL verisini sonsuza kadar stream ederek botu meşgul tutuyor

  • Bu botlar PHP dosyalarını kazımıyor, framework zafiyetleri arıyor. Beklenmedik bir yanıt verirseniz hemen vazgeçip başka hedefe geçiyorlar

  • Bazen şunu düşünüyorum — botların boşa harcadığı kaynaklarla kripto para madenciliği yaptırmak mümkün olmaz mı?

    • Denemek için JavaScript çalıştırmalarını sağlamak gerekir ama botların çoğunun buna karşı zaten savunmaları vardır