Teknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor HaberleriTeknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor HaberleriTeknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor Haberleri
Yazı Tipi BoyutlandırıcıAa
  • Anasayfa
  • Teknoloji
    • Siber Güvenlik
    • Yapay Zeka
    • Donanım
    • Bilim
  • Yazılım
  • Savunma & İstihbarat
  • Oyun
  • Yaşam
    • Finans
    • Sinema
    • Dünyadan Haberler
  • İş Birliği
Okuma: Dijital Kertenkeleleri Avlamak: Laravel v2.4.0’da Bot Ağına Karşı Nasıl Başarılı Olduk
Paylaş
Yazı Tipi BoyutlandırıcıAa
Teknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor HaberleriTeknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor Haberleri
Ara
Bizi Takip Et
  • Hakkımızda
  • Gizlilik politikası
  • Tanıtım Yazısı ve Backlink Hizmeti
© 2026 Teknomers. All Rights Reserved.

Anasayfa » Dijital Kertenkeleleri Avlamak: Laravel v2.4.0’da Bot Ağına Karşı Nasıl Başarılı Olduk

Yazılım

Dijital Kertenkeleleri Avlamak: Laravel v2.4.0’da Bot Ağına Karşı Nasıl Başarılı Olduk

teknomers
Son güncelleme: 27 Haziran 2026 11:57
teknomers
Paylaş
Paylaş

Web trafiği dünyasında basit bir kural vardır: Eğer bir kullanıcı gibi görünüyorsa, bir kullanıcı gibi yürüyorsa ve favori çerezlerini de yanında getiriyorsa—bu her zaman karşıda bir insan olduğu anlamına gelmez. Bazen, yalnızca User-Agent belgelerini dün okumuş çok çalışkan bir bot olabilir.

Bu yazıda, trafik analiz aracımızın baştan savma güven duygusundan nasıl paranoid bir doğrulama seviyesine evrildiğini ve bunun mimarimizde “bahar temizliği” yapmamıza nasıl yol açtığını paylaşacağız.

(Projenin ilk derin yeniden yapılandırması hakkında daha fazla bilgi için yazımızı okuyun: Refactoring Laravel Visit Analytics: The Path to Version 2.0.0)

Bir zamanlar genç ve saf insanlardık. User-Agent dizesine tüm kalbimizle inanıyorduk. Ona bir pasaport gibi bakıyorduk: “Ah, bu Windows 11 üzerindeki Chrome 128 mi? Hoş geldin, değerli kullanıcı!” Ancak VisitAnalytics paketimizden gelen istatistikler, bu romantik yanılsamayı hızla ortadan kaldırdı.

Garip desenler görmeye başladık: siteyi ziyaret eden binlerce “farklı” cihaz, hepsi mükemmel bir şekilde ayarlanmış, “cızırdayan” UA dize sahipti. Ancak daha yakından incelediğimizde, bu “insanların” davranışlarının şüpheli derecede tekdüze olduğunu gördük. Onlar, tek başlarına yürüyen askerler gibi görünüyordu.


Bölüm 1: Bot vs. Gerçeklik – Achilles’in Topuğu

Aktif savunmaya hemen geçmedik. İlk önce veri toplamaya başladık. İçgüdümüz, tüm kullanıcıların görünüşte olduğundan farklı olduğunu söylüyordu. Botlar, User-Agent dizilerini öyle bir şekilde taklit etmeyi öğrendiler ki, gerçek tarayıcılardan ayırt edilemiyorlardı. Ama bir Achilles’in topukları vardı: Client Hints (Sec-CH-* başlıkları).


Logları gözlemleyerek temel bir farkı fark ettik:

Gerçek insanlar başlıkları “optimize” etmezler.

Gerçek bir kullanıcının tarayıcısı otomatik olarak bir dizi Sec-CH-* başlığı gönderir: motor versiyonundan işlemci mimarisine kadar. Bu, güncellemelerle birlikte değişen “canlı” bir bilgidir. Dahası, normal bir insanın "Accept-Language":"en-US,en;q=0.9,fr;q=0.8,es;q=0.7" başlığı, bot muadilinden farklıdır: "accept-language":"en-US,en;q=0.9".

Botlar ya tembeldir ya da aşırı düşünürler.

Paketimizin istatistiklerini analiz ettiğimizde, bot üreticilerinin ya Sec-CH-* başlıklarını tamamen unuttuğunu, ya da “aşırı optimize” ettiklerini fark ettik. Bunu programatik olarak üretmeye çalışarak mantıksal tutarsızlıklara yol açıyorlardı. Bu, frak giyen ama lastik çizmeler giyen bir kişi gibiydi: ayrı ayrı, tümü güzeldi, ama birlikte olduğunda “terziyi” sorgulatıyordu.

İşte loglardan alınmış iki örnek. İlk örnek tipik bir insan ziyareti:

{ 
            "id": 1234, 
            "ip_address": "2003:c1:d71c:fe1f::", 
            "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36", 
            "target_headers": "{\"sec-ch-ua\":\"\\\"Not)A;Brand\\\";v=\\\"8\\\", \\\"Chromium\\\";v=\\\"138\\\", \\\"Google Chrome\\\";v=\\\"138\\\"\", 
            \"sec-ch-ua-platform\":\"\\\"Windows\\\"\", 
            \"sec-ch-ua-mobile\":\"?0\", 
            \"sec-fetch-site\":\"none\", 
            \"sec-fetch-dest\":\"document\", 
            \"sec-fetch-mode\":\"navigate\", 
            \"accept-language\":\"en-US,en;q=0.9,fr;q=0.8,es;q=0.7\", 
            \"accept-encoding\":\"gzip, br\"} 
            }

Tek bir şey vardı ki, onlar siteyi gezmiyordu; yalnızca bir makaleyi okuyorlar. İşte şimdi ikinci örnek, net bir bot:

{ 
            "id": 1235, 
            "ip_address": "14.165.179.0", 
            "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36", 
            "target_headers": "{\"accept-encoding\":\"gzip, br\"}, 
            "url": "https://oleant.dev/en/blog/how-to-write-a-resume-for-german-companies", 
            "referer": null, 
            "payload": null, 
            "processed_at": "2026-05-25 10:00:02", 
            "anonymized_at": "2026-05-25 11:00:02", 
            "bot_score": 85, 
            "is_bot": 1, 
            "is_official_bot": 0, 
            "bot_reasons": "[\"suspicious_minimal_headers\"]", 
            "bot_evidence": "{\"suspicious_minimal_headers\":{\"found_count\":1,\"required_count\":5},\"analyzed_at\":\"2026-05-25 10:00:02\"}, 
            "created_at": "2026-05-25 09:51:05.092" 
            } 
            

Bu “müşteri”, kaybolan başlıklar nedeniyle kendini açığa çıkardı. Ancak bu farkındalığa hemen ulaşmadık—kavrayışımız nasıl evrildi, bunu inceleyelim.


Bölüm 2: İstatistiklerin Kanıt Haline Geldiği Zaman

Botların, içsel çelişkilerle kendilerini ifşa ettiğini fark ettiğimizde, bir aşama kaydettik. Örneğin, bir User-Agent Windows olduğunu iddia ederken, Sec-CH-UA-Platform başlıkları timsah gibi Android’i işaret ediyordu.

O anda anladık: dış görünüşe güvenmeyi bırakmalıyız. İstatistikler, doğru kimliklendirme için yalnızca başlıkları okumakla kalmayıp, onları içindeki bilişsel tutarsızlıkları aramamız gerektiğini gösterdi. Ziyaretleri yalnızca “kaydetme” ve ziyaretlerin bütünlüğünü analiz etme aşamasına geçtik; log dosyalarımızı basit bir tablo olmaktan çıkarıp her “dijital bukalemun” için gerçek bir dosyaya dönüştürdük. Bu anlayış, daha sonra pasif gözlemden, botnet avlamaya geçiş sağlamamıza olanak tanıdı.


Botnetleri Nasıl Takip Ettik

Tek başına User-Agent yeterli değildi. Botların, herhangi bir görev için bu dizeyi ustaca taklit ettiğini anladık. Ancak logları gözlemlerken sürekli bir desen gördük: Botnetler genellikle IP adreslerini döndürmek için proxy kullanarak, kendilerini gizlemeye çalışıyorlardı. Ama unuttukları bir detay vardı—seyahatlerin “ortamı”.


Kaosta İstikrar

Sürekli IP değişimlerine (muhtemelen proxy çiftlikleri aracılığıyla) rağmen, botlar için User-Agent + Client Hints kombinasyonunun şüpheli derecede kararlı olduğunu gördük. Bu, onların imzasıydı. Yüzlerini değiştirebilirlerdi (IP), ama “dijital iskeletleri” (headers) tüm ağ için değişmeyen bir yapıydı. Onları açığa çıkarmak için bir Fingerprint oluşturduk: bir dizi başlıktan oluşan ve ana silahımız haline gelen benzersiz bir hash. Laravel 11’de bunu doğrudan Middleware TrackVisits‘te uygulayarak, bir set başlığı kararlı bir kimlik haline getirdik:

// Hash üretimi: UA'yı kritik başlıklarla birleştirme
$targetHeaders = $this->extractTargetHeaders($request);
// IP değişse bile, hash içeriği botnet için sabit kalır
$fingerprintInput = $request->userAgent() . '|' . json_encode($targetHeaders);
$fingerprintHash = hash('sha256', $fingerprintInput);


Küme Avlayarak

Hamle yapmaya başladığımızda, aynı hash’in bir saat içinde 50,000 farklı IP adresinden geldiğini gözlemlediğimizde, bu bir botnet olduğunu biliyorduk. Daha önce verileri botnet_fingerprints tablosunda saklıyorduk ama bu, kısa sürede “kullanılamaz bir mezarlık” haline dönüşmüştü. Bu nedenle, bir arşive değil, gerçek zamanlı tepkilere ihtiyacımız olduğunu fark ettik. BotnetAnalyzer‘ı şu anki pencerede aktivite analiz eden anormallikleri “anında” aramak için yeniden yazdık:

// Geçerli penceredeki anormallikleri sorgulamadan arama
$window = now()->subMinutes($params['analysis_window_minutes'] ?? 10);
// Farklı IP adreslerinden hash eşleşmelerini arama
$isCluster = VisitLog::where('fingerprint_hash', $log->fingerprint_hash)
    ->where('created_at', '>=', $window)
    ->where('ip_address', '!=', $log->ip_address) 
    ->exists();
if ($isCluster) {
    // Botların tüm "paketi" anında belirlenir
    $this->markAsBotnet($log->fingerprint_hash);
}

botnet_fingerprints veritabanasından kaldırdığımızda, sistem anında hızlandı. “Ölü” proxy geçmişini biriktirmeyi bıraktık ve botnet “orchestrator”ını onların yazılımlarını takip ederek tespit etmeye başladık. Eğer yüzlerce farklı IP aynı fingerprint ile gelirse—proxies’i ne kadar sık döndürsüdürlerse döndürsün, bunun aynı “ordu” olduğunu görüyoruz.


Bölüm 3: Augean İstablolarının Temizliği

Botnet avı başarıyla başladı, ancak “dijital trofey odası” bizi boğmaya başladı. Her bir şüpheli hash’i botnet_fingerprints tablosunda saklıyorduk. Her geçen gün, mayalanarak büyüyor, güvenlik aracından bir veritabanı darboğazına dönüşüyordu.

Toplama tuzağına düştüğümüzü anladık. Saldırı geçmişini depolamaya çalışıyorduk, oysa gerçekte şu an olanları bilmemiz gerekiyordu. Bu nedenle radikal bir adım attık: botnet_fingerprints tablosunu veritabanı şemasından sildik.


Optimizasyon Sonuçları

Çabalarımızın sonucu beklentilerimizin ötesine geçti:

  • Veritabanı yükü %40 azaldı. Ağı ağır JOIN’ler ve sonsuz SELECT’ler geride kaldı.

  • Tepki hızı. Şüphe kontrolleri neredeyse anında gerçekleşiyor. Header analizörlerimizin ilk hattı, botların %95’inin daha pahalı kontrollere ulaşmadan filtrelenmesini sağlıyor (örneğin ağ tabanlı PTR kaydı aramaları gibi). Tüm 11 analizör sadece insanlar veya henüz yakalanmamış botlardan geçiyor; bu da sadece birkaç yüzdelik dilim. Diğerlerinin “markası” kontrol kuyruğundaki analizörlerden biri tarafından hemen belirleniyor.

  • Temiz bir vicdan. “Kötülük arşivcisi” olmaktan çıktık ve dijital minimalistler haline geldik.

Artık sistem, biriktirilmiş “dijital yükten” muzdarip değil. O anı yaşıyor: isteği analiz ediyor, “sıcak” kalıplarla karşılaştırıyor ve gerekli görülürse tehditi anında işaretliyor. Botnet koruması için önemin derin geçmişte değil, burada ve şimdi karar verme hızında olduğunu öğrendik.


Bölüm 4: Gizlilik İkilemi ya da “Kim Orada?”

Botları hash’ler aracılığıyla avlamaya başladığımızda, bir etik ikilemle karşılaştık. O aynı fingerprint_hash botnetleri tanımlamamıza yardımcı olan, aynı zamanda gerçek insanların “dijital ayak izi” haline geliyordu. Eğer bir hash tutuyorsak, bu çözülebilir veya orijinal başlıklarla eşleşebilir, bu da kişisel verileri depolamak anlamına gelir. Ve biz gizliliğe önem veriyoruz!

Amaç nettir: botnet aktivitesini görmeliyiz, fakat kullanıcıların kimliklerini görmeden.


2.4.0’da Anonimleşme Standartı

FingerprintAnonymizerService‘i uyguladık. Mantığı basit: log kayıt altına alındığında, sistem analiz için gerekli olan ancak gerçek anonimleşme için fazla kapsamlı olan verileri korur. Analiz sonrasında, karşımızdakinin kim olduğunu—insan mı bot mu—anlayana kadar, parmak izlerine ihtiyacımız kalmıyor. Botu, parmakları ve diğer parçalarıyla tamamen tecrit altına alırken, değerli vatandaşı siteye tam bir saygı ile karşılıyoruz. Tüm hassas veriler temizleniyor. Garson (web servisi), nihayetinde bir polis ya da güvenlik görevlisi değil; misafirler disko’daysa, onlar bizim misafirlerimizdir ve kişisel verileri bizim için önemli değildir. Ama eğer bir hırsız (yani bir bot) varsa, hırsız (yani bot) hapiste kalmalıdır (bir film alıntısı). Onun da kişisel mahkumu numarası var, ama özel olanaklar olmadan. Bot John Johnson, yalnızca mahkum №245 haline gelir; umarım ana fikir açıktır.

public function handle(VisitLog $log): array {
            $updates = [];
            // Karmaşık User-Agent'ı basit bir istemci "portresine" dönüştürme
            if ($config['anonymize_ua'] ?? true) {
                $updates['user_agent'] = $this->anonymizeUserAgent($log);
            }
            // Ayrıntılı başlıkları basit anahtar listesi ile değiştirme
            if ($config['anonymize_headers'] ?? true) {
                $updates[] = $this->anonymizeHeaders($log->target_headers);
            }
            // Analiz tamamlandıysa orijinal hash'i silme
            if ($config[] ?? true) {
                $updates[] = ;
            }
            return $updates;
        }
        


Veriyi “bilgi gürültüsüne” Dönüştürme

En ilginç dönüşüm anonymizeUserAgent içinde gerçekleşiyor. Artık ham UA dizisini saklamıyoruz. Bunun yerine, Client Hints (mevcutsa) kullanarak genel parametreleri—tarayıcı, işletim sistemi ve platformu—çıkarıyoruz ve benzersiz tanımlayıcıları eliyoruz.

Anonimleşme öncesi:
Özel motor versiyonu, işlemci mimarisi ve bir dizi parametre görüyorduk ki, bunlar birleştiğinde benzersiz bir kullanıcıyı “parmak izi” gibi tanımlayabilecek değerlerdi.

Anonimleşme sonrası:
Sadece Chrome / Windows (Masaüstü) görüyoruz.
Benzer bir yaklaşımı başlıklara da uyguladık: anonymizeHeaders metodu yalnızca anahtarların bir dizisini döndürüyor (array_keys), tüm değerleri sıfırdan eliyor. Sonuç? Loglarımız artık bir “istatistiksel genelleme” seti gibi görünüyor. Hala bir botnetin siteye saldırdığını görüyoruz ve sistemde bunu işaretliyoruz, ancak şimdi gizlilik ihlali iddialarına karşı tam koruma altındayız. Her ziyaretçinin davranışına dair ayrıntılı bir izi, güvenli bir haldeki toplu istatistik akışına dönüştürdük.

Artık veritabanı elimize geçtiğinde, veriler şifrelenmiş çöp gibi görünüyor, bu da kullanıcılara yönelik de anonimleşme sürecini güvence altına alıyor.


Sonuç: Versiyon 2.4.0 — Dedektiften Profesyonel Sisteme

Tüm bu maceralardan—User-Agent’ın “dürüstlüğünden” hayal kırıklığına ve arşiv tablolarının silinmesine kadar—çeşitlilik dönüşümünü tamamladık. Bu yalnızca küçük bir güncelleme değil. Ürünümüz, yalnızca log tutan “hobi dedektifi”den, internetin en önemli dersi olan “kimseye güvenmemeniz gerektiği” konusunda eğitim almış profesyonel bir koruma sistemine dönüştü.


Nihai Mesaj:

Performans.
Gereksiz tabloları bırakarak ve gerçek zamanlı analize geçerek veritabanı yükünü %40 azaltmayı başardık.

Gizlilik Öncelikli.
FingerprintAnonymizerService sayesinde artık “gizli kalmayı tercih edenler” değiliz. Tehdit kalıplarını analiz ederken kullanıcıların kişisel verilerini gözden kaçırmıyoruz.

Akıllı Tespit.
Şimdi botnetleri IP ile değil, “dijital imzaları” ile yakalıyoruz, bu da proxy döndürme girişimlerini anlamlı kılmıyor.


Sırada Ne Var?

Gelişmeye devam ediyoruz. “Şüpheli” parmak izlerinin uç bir şekilde, anında doğrulanması için Bloom filtrelerini uygulamayı planlıyoruz. Arayüz konusunda, Filament ile derin entegrasyon planalarımızı için şimdilik erteledik. Evet, güzel paneller ve saldırı grafikleri görmek istiyoruz, ancak mevcut önceliğimiz maksimum veri saflığı ve tespit doğruluğudur. Filament, vitrin; fakat biz inşaat halindeyiz. Ama garanti edelim ki, admin panelindeki botnet görselleştirmesi yalnızca bir zaman meselesidir ve bu madde, backlog’umuzda en üstteki yerini almıştır.

Versiyon 2.4.0 bir temel oluşturuyor. Görünmez olanı görmeyi öğrendik ve sistemi gereksiz “dijital çöp”ten arındırdık. Daha hızlı, daha büyük ve daha verimli olmaya devam ediyoruz.

Takipte kalın, avlanmaya devam ediyoruz.

Kaynak: Orijinal Makale

Contents
  • Bölüm 1: Bot vs. Gerçeklik – Achilles’in Topuğu
    • Logları gözlemleyerek temel bir farkı fark ettik:
  • Bölüm 2: İstatistiklerin Kanıt Haline Geldiği Zaman
    • Botnetleri Nasıl Takip Ettik
    • Kaosta İstikrar
    • Küme Avlayarak
  • Bölüm 3: Augean İstablolarının Temizliği
    • Optimizasyon Sonuçları
  • Bölüm 4: Gizlilik İkilemi ya da “Kim Orada?”
    • 2.4.0’da Anonimleşme Standartı
    • Veriyi “bilgi gürültüsüne” Dönüştürme
  • Sonuç: Versiyon 2.4.0 — Dedektiften Profesyonel Sisteme
    • Nihai Mesaj:
    • Sırada Ne Var?
Laravel’de Monolit Kullanımı – DEV Community
Laravel Geliştiricileri — Muhtemelen Framework’ün Sadece %40’ını Kullanıyorsunuz
Laravel’de Çoklu Departman Onay İş Akışı Nasıl Oluşturulur
WordPress Geliştiricilerinin Laravel Öğrenmesi Gereken Nedenler
Laravel Middleware Çalışmıyor mu? Tam Çözüm Rehberi
Bu Makaleyi Paylaş
Facebook Bağlantıyı Kopyala Yazdır
Paylaş
Önceki Makale Kütüphanenizi canlandırın: 27$’dan başlayan Blu-Ray/DVD sürücüler
Sonraki Makale IBM 0.7nm Teknolojisi: %50 Daha Fazla Performans ve %70 Enerji Verimliliği

Sanal Medya

FacebookBeğen
452Takip Et
PinterestSabitle
237Takip Et

Son Eklenenler

Akıllı Ev Endüstrisi Matter İçin Neden Hala Bahis Oynuyor?
Liste
Bambu Lab A2L 3D Yazıcı İncelemesi: A1’in Gelişimi
Donanım
Jujutsu Legacy Dünyasında Yeni Kodlarla Sürprizler Seni Bekliyor
Oyun
Acil: GPT-5.6 Sol’un Kısıtlı Erişimi ve Güçlü Siber Önlemleri
Siber Güvenlik
Yeni En İyi Akıllı Hoparlör Olabilir Mi?
Liste
DeleteMe Gerçekten Bilgilerinizi İnternetten Silinmesini Sağlıyor Mu?
Genel
//

Siber güvenlik, yapay zeka ve savunma sanayiinden; finans ve sinema dünyasına uzanan geniş bir yelpaze. Teknomers; teknoloji, strateji ve yazılım dünyasını sade bir dille sizlerle buluşturuyor.

Kurumsal

  • Hakkımızda
  • Gizlilik politikası
  • Tanıtım Yazısı ve Backlink Hizmeti

Kategoriler

  • Teknoloji
  • Oyun
  • Sinema
  • Siber Güvenlik
  • Bilim
  • Finans
  • Dünyadan Güncel Haberler

Populer

  • TV'de Ücretsiz İzlenebilen Şifresiz Erotik Kanallar (2025 Güncel Frekans Listesi)

  • The Last of Us PC Kontrolleri: Hızlı Silah Değiştirme ve Tüm Tuşlar (2025)

  • Hogwarts Legacy'de Odaklanma İksiri Nasıl Yapılır?

Teknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor HaberleriTeknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor Haberleri
Bizi Takip Et
© 2026 Teknomers. All Rights Reserved.
Welcome Back!

Sign in to your account

Kullanıcı Adı veya E-posta Adresi
Şifre

Şifrenizi mi unuttunuz?