<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://sonsuzus.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://sonsuzus.github.io/" rel="alternate" type="text/html" /><updated>2026-07-26T07:13:23+00:00</updated><id>https://sonsuzus.github.io/feed.xml</id><title type="html">SonsuzUs</title><subtitle>Programlama ve Yazılım</subtitle><author><name>Sonsuz Us</name></author><entry><title type="html">Ağdaki Görünmez Gözler: Wireshark ve Ettercap ile MitM Analizi</title><link href="https://sonsuzus.github.io/posts/agdaki-gorunmez-gozler-wireshark-ve-ettercap-ile-mitm-analizi/" rel="alternate" type="text/html" title="Ağdaki Görünmez Gözler: Wireshark ve Ettercap ile MitM Analizi" /><published>2026-07-26T00:00:00+00:00</published><updated>2026-07-26T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/agdaki-gorunmez-gozler-wireshark-ve-ettercap-ile-mitm-analizi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/agdaki-gorunmez-gozler-wireshark-ve-ettercap-ile-mitm-analizi/"><![CDATA[<p>Bir ağdan geçen veriler gerçekten görünmez mi? Ne yazık ki hayır. Özellikle şifrelenmemiş protokoller kullanıldığında paketler, aynı ağı paylaşan kötü niyetli kişiler tarafından okunabilir. Wireshark ve Ettercap, yalnızca izinli laboratuvar ortamlarında kullanıldığında bu riski gözlemlemek, paketlerin yapısını öğrenmek ve savunma yöntemlerini test etmek için oldukça güçlü araçlardır.</p>

<p>``</p>

<h2 id="paket-dinleme-nasıl-çalışır">Paket dinleme nasıl çalışır?</h2>

<p>Bilgisayarlar iletişim kurarken veriyi küçük paketlere böler. Her pakette kaynak ve hedef adresleri, kullanılan protokol ve taşınan veri gibi alanlar bulunur. Ağ kartı normalde yalnızca kendisine gönderilen çerçeveleri işler. <strong>Promiscuous mode</strong> etkinleştirildiğinde ise erişebildiği diğer çerçeveleri de yakalama yazılımına iletebilir.</p>

<p>Yakalanan veri miktarı yaklaşık olarak</p>

\[D = R \times t\]

<p>şeklinde düşünülebilir. Burada $R$ saniyedeki ortalama trafik miktarını, $t$ dinleme süresini, $D$ ise incelenecek toplam veriyi temsil eder. Yoğun bir ağda kısa süreli kayıtların bile hızla büyümesinin nedeni budur.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Wireshark</th>
      <th>Ettercap</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Temel amaç</td>
      <td>Paket yakalama ve ayrıntılı analiz</td>
      <td>MitM senaryolarını laboratuvarda inceleme</td>
    </tr>
    <tr>
      <td>Kullanım biçimi</td>
      <td>Grafik arayüz ve görüntüleme filtreleri</td>
      <td>Grafik veya terminal arayüzü</td>
    </tr>
    <tr>
      <td>Güçlü yanı</td>
      <td>Protokol çözümleme</td>
      <td>Ağ uçları arasındaki akışı gözlemleme</td>
    </tr>
    <tr>
      <td>Başlıca risk</td>
      <td>Hassas verilerin kaydedilmesi</td>
      <td>Aktif ağ müdahalesi ve bağlantı bozulması</td>
    </tr>
  </tbody>
</table>

<h2 id="wireshark-ile-güvenli-trafik-analizi">Wireshark ile güvenli trafik analizi</h2>

<p>Kendi bilgisayarınızda veya izole bir sanal laboratuvarda doğru ağ arayüzü seçilerek kayıt başlatılabilir. Wireshark yüzlerce protokolü tanıdığı için filtre kullanmak önemlidir. Aşağıdaki görüntüleme filtreleri mevcut kayıt içerisindeki paketleri daraltır; yeni bir saldırı gerçekleştirmez:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>http

dns

tcp.port == 80

ip.addr == 192.0.2.10
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">http</code>, şifrelenmemiş HTTP paketlerini; <code class="language-plaintext highlighter-rouge">dns</code>, alan adı sorgularını gösterir. <code class="language-plaintext highlighter-rouge">tcp.port == 80</code> belirli bir TCP portuna, <code class="language-plaintext highlighter-rouge">ip.addr</code> ise dokümantasyon amacıyla ayrılmış örnek bir IP adresine odaklanır. Bir paket seçildiğinde Ethernet, IP, TCP ve uygulama katmanları ayrı ayrı açılarak başlık bilgileri incelenebilir.</p>

<p>Komut satırında yalnızca kendi arayüzünüzde temel bir protokol özeti görmek için TShark da kullanılabilir:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>tshark <span class="nt">-i</span> &lt;izinli-arayuz&gt; <span class="nt">-f</span> <span class="s2">"tcp port 80"</span>
</code></pre></div></div>

<p>Bu komut HTTP içeriğini değiştirmez; belirtilen arayüzdeki 80 numaralı TCP portuna ait trafiği görüntüler. Yakalama dosyaları hassas bilgi içerebileceğinden paylaşılmadan önce anonimleştirilmelidir.</p>

<h2 id="ettercap-ve-ortadaki-adam-mantığı">Ettercap ve ortadaki adam mantığı</h2>

<p>MitM saldırısında saldırgan, iki uç arasındaki iletişimin ortasına yerleşmeye çalışır. Yerel ağlarda bunun tarihsel örneklerinden biri, sahte ARP yanıtlarıyla cihazların IP–MAC eşleştirmelerini yanıltmaktır. Trafik saldırgan üzerinden geçerse şifrelenmemiş içerik okunabilir veya değiştirilebilir.</p>

<p>Ettercap bu davranışı eğitim laboratuvarlarında canlandırabilir; ancak aktif ARP manipülasyonu gerçek ağlarda kesintiye, veri ihlaline ve hukuki sonuçlara yol açabilir. Bu nedenle saldırı komutları üretim ağında denenmemeli; yalnızca sahibi olduğunuz, internetten ayrılmış sanal makinelerde ve açık izinle çalışılmalıdır.</p>

<h2 id="şifreleme-neden-oyunu-değiştirir">Şifreleme neden oyunu değiştirir?</h2>

<p>HTTP kullanıldığında istek yolu, başlıklar ve form alanları açık biçimde görülebilir. HTTPS ise uygulama verisini TLS ile şifreler. Dinleyici IP adresleri, portlar ve paket boyutları gibi metaverileri görebilse de içerik uygun anahtar olmadan anlamlı değildir.</p>

<table>
  <thead>
    <tr>
      <th>Protokol</th>
      <th>İçerik görünürlüğü</th>
      <th>Tercih</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>HTTP, FTP, Telnet</td>
      <td>Genellikle açık metin</td>
      <td>Kullanılmamalı</td>
    </tr>
    <tr>
      <td>HTTPS, SFTP, SSH</td>
      <td>Şifreli</td>
      <td>Önerilir</td>
    </tr>
    <tr>
      <td>Güvensiz Wi-Fi</td>
      <td>Dinlemeye daha açık</td>
      <td>VPN ve HTTPS kullanılmalı</td>
    </tr>
  </tbody>
</table>

<p>Savunma için HTTPS zorunluluğu, güvenli DNS seçenekleri, VPN, dinamik ARP denetimi, istemci izolasyonu ve sertifika uyarılarının ciddiye alınması önemlidir. Wireshark ile olağan dışı ARP yanıtları veya tekrarlanan adres değişimleri araştırılabilir. Kısacası bu araçların en değerli kullanımı başkalarının verisini yakalamak değil, kendi ağımızın hangi koşullarda savunmasız kaldığını görüp şifrelemeyi doğru uygulamaktır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="Wireshark" /><category term="Ettercap" /><category term="ağ güvenliği" /><summary type="html"><![CDATA[Bir ağdan geçen veriler gerçekten görünmez mi? Ne yazık ki hayır. Özellikle şifrelenmemiş protokoller kullanıldığında paketler, aynı ağı paylaşan kötü niyetli kişiler tarafından okunabilir. Wireshark ve Ettercap, yalnızca izinli laboratuvar ortamlarında kullanıldığında bu riski gözlemlemek, paketlerin yapısını öğrenmek ve savunma yöntemlerini test etmek için oldukça güçlü araçlardır.]]></summary></entry><entry><title type="html">Bilgi Toplama Araçları: Nmap, Maltego ve Recon-ng ile Footprinting Mantığı</title><link href="https://sonsuzus.github.io/posts/bilgi-toplama-araclari-nmap-maltego-ve-recon-ng-ile-footprinting-mantigi/" rel="alternate" type="text/html" title="Bilgi Toplama Araçları: Nmap, Maltego ve Recon-ng ile Footprinting Mantığı" /><published>2026-07-26T00:00:00+00:00</published><updated>2026-07-26T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/bilgi-toplama-araclari-nmap-maltego-ve-recon-ng-ile-footprinting-mantigi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/bilgi-toplama-araclari-nmap-maltego-ve-recon-ng-ile-footprinting-mantigi/"><![CDATA[<p>Bir sistemi güvenli hâle getirmenin ilk adımı, saldırgan gözüyle ne kadar görünür olduğunu anlamaktır. Bilgi toplama, yani footprinting, hedef hakkında alan adları, IP aralıkları, açık portlar, kullanılan teknolojiler, ilişkili e-posta adresleri ve organizasyon yapısı gibi ipuçlarını sistemli biçimde toplamaktır. Elbette bu süreç yalnızca izinli testlerde, kendi laboratuvarında veya kurum içi güvenlik çalışmalarında yapılmalıdır; çünkü aynı teknikler savunma kadar kötüye kullanım için de değerlidir.
``</p>

<p>Bilgi toplama iki ana aileye ayrılır: pasif ve aktif. Pasif toplamada hedef sisteme doğrudan dokunmadan açık kaynaklardan veri çekilir; arama motorları, WHOIS kayıtları, sertifika şeffaflığı kayıtları ve sosyal ağlar buna örnektir. Aktif toplamada ise hedefe paket gönderilir; port taraması, servis sürüm tespiti ve ağ haritalama bu gruba girer. Basit bir zihinsel model kurarsak, görünür risk yaklaşık şöyle düşünülebilir: $R = A \times E \times V$. Burada $A$ saldırı yüzeyi, $E$ erişilebilirlik, $V$ ise zafiyet olasılığıdır. Bilgi toplama, bu üç değişkeni daha net ölçmeye yarar.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th style="text-align: right">Hedefe temas</th>
      <th>Tipik araç</th>
      <th>Avantaj</th>
      <th>Risk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Pasif OSINT</td>
      <td style="text-align: right">Yok veya çok az</td>
      <td>Maltego, Recon-ng</td>
      <td>Sessiz ve geniş kapsamlı</td>
      <td>Veri eski olabilir</td>
    </tr>
    <tr>
      <td>Aktif tarama</td>
      <td style="text-align: right">Var</td>
      <td>Nmap</td>
      <td>Güncel teknik sonuç verir</td>
      <td>Log bırakır, izin gerekir</td>
    </tr>
    <tr>
      <td>Hibrit analiz</td>
      <td style="text-align: right">Kontrollü</td>
      <td>Üçü birlikte</td>
      <td>Daha doğru korelasyon</td>
      <td>Yanlış yorum maliyeti artar</td>
    </tr>
  </tbody>
</table>

<p>Nmap, aktif keşif tarafının İsviçre çakısı gibidir. Bir ağı haritalamak, açık portları görmek ve servislerin sürümlerini tahmin etmek için kullanılır. Örneğin kendi test makinenizde şu komut, yaygın portları ve servis bilgilerini listeler:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nmap <span class="nt">-sV</span> <span class="nt">-O</span> 192.168.56.10
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">-sV</code> servis sürüm tespiti yapar, <code class="language-plaintext highlighter-rouge">-O</code> işletim sistemi tahminini dener. Sonuçta 22/tcp üzerinde OpenSSH, 80/tcp üzerinde Nginx gibi bilgiler görebilirsiniz. Ancak çıktıyı büyülü kehanet gibi değil, olasılık tablosu gibi okumak gerekir. Nmap paket davranışlarından tahmin yapar; güvenlik duvarları, ters proxyler veya honeypotlar sonuçları yanıltabilir.</p>

<p>Maltego ise ilişkileri görselleştirme konusunda parlıyor. Bir alan adından başlayıp DNS kayıtlarına, alt alan adlarına, e-posta desenlerine, sosyal medya izlerine ve şirket bağlantılarına uzanan bir grafik çıkarabilir. Maltego’nun gücü tek bir veriden çok, düğümler arasındaki ilişkiyi göstermesidir. Örneğin bir e-posta adresinin aynı zamanda sızmış veri kümelerinde, GitHub commitlerinde ve kurum sayfalarında görünmesi, savunma ekibine farkındalık eğitimi veya erişim politikası açısından sinyal verebilir.</p>

<p>Recon-ng, terminal sevenler için modüler bir OSINT çatısıdır. Metasploit benzeri bir çalışma akışı vardır: workspace oluştur, modül seç, kaynak ekle, sonucu tabloya yaz. Kendi alan adınız üzerinde pasif keşif yaparken şöyle bir akış kullanılabilir:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>recon-ng
workspaces create lab
marketplace search domains
modules load recon/domains-hosts/hackertarget
options <span class="nb">set </span>SOURCE example.com
run
show hosts
</code></pre></div></div>

<p>Bu komutlar, seçilen modül destekliyorsa <code class="language-plaintext highlighter-rouge">example.com</code> için host kayıtlarını toplar ve veritabanında saklar. Recon-ng’nin güzel tarafı, çıktıları düzenli tutmasıdır; böylece bulunan alt alan adlarını daha sonra Nmap ile doğrulayabilir veya Maltego grafiğine aktarabilirsiniz.</p>

<p>Pratikte iyi bir bilgi toplama süreci sırayla ilerler: kapsamı belirle, pasif kaynaklardan veri topla, veriyi temizle, aktif taramayı yalnızca izinli aralıkta çalıştır, sonuçları ilişkilendir ve raporla. En sık yapılan hata, araç çıktısını doğrudan gerçek kabul etmektir. Oysa aynı IP üzerinde CDN, paylaşımlı hosting veya bulut yük dengeleyici olabilir. Bu yüzden her bulguya güven puanı vermek faydalıdır: $G = \frac{D}{T}$ gibi basit bir oran düşünebiliriz; burada $D$ doğrulanan kaynak sayısı, $T$ toplam iddia sayısıdır.</p>

<p>Sonuç olarak Nmap sana teknik kapıları, Maltego ilişkisel haritayı, Recon-ng ise tekrarlanabilir OSINT akışını sunar. Üçünü birlikte kullandığında hedefin dijital siluetini daha net görürsün. Ama unutma: iyi bir güvenlik uzmanını araç listesi değil, etik sınırları, metodolojisi ve bulguları doğru yorumlama becerisi güçlü yapar.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="siber güvenlik" /><category term="information gathering" /><category term="nmap" /><category term="osint" /><summary type="html"><![CDATA[Bir sistemi güvenli hâle getirmenin ilk adımı, saldırgan gözüyle ne kadar görünür olduğunu anlamaktır. Bilgi toplama, yani footprinting, hedef hakkında alan adları, IP aralıkları, açık portlar, kullanılan teknolojiler, ilişkili e-posta adresleri ve organizasyon yapısı gibi ipuçlarını sistemli biçimde toplamaktır. Elbette bu süreç yalnızca izinli testlerde, kendi laboratuvarında veya kurum içi güvenlik çalışmalarında yapılmalıdır; çünkü aynı teknikler savunma kadar kötüye kullanım için de değerlidir.]]></summary></entry><entry><title type="html">Kali Linux Felsefesi ve Etik Hacking: Ofansif Güvenliğin Ahlaki Pusulası</title><link href="https://sonsuzus.github.io/posts/kali-linux-felsefesi-ve-etik-hacking-ofansif-guvenligin-ahlaki-pusulasi/" rel="alternate" type="text/html" title="Kali Linux Felsefesi ve Etik Hacking: Ofansif Güvenliğin Ahlaki Pusulası" /><published>2026-07-26T00:00:00+00:00</published><updated>2026-07-26T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/kali-linux-felsefesi-ve-etik-hacking-ofansif-guvenligin-ahlaki-pusulasi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/kali-linux-felsefesi-ve-etik-hacking-ofansif-guvenligin-ahlaki-pusulasi/"><![CDATA[<p>Kali Linux, çoğu kişinin aklına kapüşonlu hacker sahneleri getirse de gerçekte bir “sihirli saldırı kutusu” değil; güvenlik uzmanlarının sistemleri kontrollü, izinli ve ölçülebilir biçimde test etmesi için hazırlanmış bir ofansif güvenlik laboratuvarıdır. Felsefesi basittir: Bir açığı kötü niyetli biri keşfetmeden önce sen bul, kanıtla, raporla ve kapatılmasını sağla.
``</p>

<h2 id="kalinin-vizyonu-araç-değil-metodoloji">Kali’nin Vizyonu: Araç Değil, Metodoloji</h2>

<p>Kali Linux’u güçlü yapan şey yalnızca içinde yüzlerce aracın gelmesi değildir. Asıl değer, bu araçların keşif, analiz, doğrulama ve raporlama gibi aşamalı bir güvenlik metodolojisine hizmet etmesidir. Etik hacking, teknik beceri kadar sınır bilinci de ister. Çünkü aynı komut, izinli bir laboratuvarda savunma; izinsiz bir sistemde suç anlamına gelebilir.</p>

<p>Siber güvenlikte temel risk modeli genellikle şöyle düşünülür: $Risk = Olasılık \times Etki$. Bir güvenlik uzmanı, bir zafiyetin gerçekleşme olasılığını ve gerçekleşirse doğuracağı etkiyi analiz eder. Kali bu süreçte büyüteç gibidir: Sistemdeki zayıf noktaları görünür kılar; fakat ne yapılacağına etik ilkeler karar verir.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Amaç</th>
      <th>Sonuç</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Etik hacking</td>
      <td>Açıkları izinle tespit etmek</td>
      <td>Güvenlik artar</td>
    </tr>
    <tr>
      <td>Kötü niyetli saldırı</td>
      <td>Yetkisiz erişim ve zarar</td>
      <td>Hukuki ve etik ihlal</td>
    </tr>
    <tr>
      <td>Savunmacı test</td>
      <td>Riskleri ölçmek</td>
      <td>Önceliklendirilmiş iyileştirme</td>
    </tr>
  </tbody>
</table>

<h2 id="ofansif-güvenlik-neden-gereklidir">Ofansif Güvenlik Neden Gereklidir?</h2>

<p>Savunma yalnızca duvar örmek değildir; o duvarın nereden yıkılabileceğini de anlamaktır. Ofansif güvenlik, saldırgan bakış açısını taklit eder ama zarar verme niyeti taşımaz. Bu yaklaşım, “düşman gibi düşün, koruyucu gibi davran” prensibine dayanır.</p>

<p>Bir kurumun güvenliği, sadece antivirüs veya güvenlik duvarı kullanmasıyla ölçülmez. Yanlış yapılandırılmış servisler, zayıf parolalar, güncellenmemiş yazılımlar ve bilinçsiz kullanıcı davranışları saldırı yüzeyini büyütür. Bu yüzeyi teorik olarak $A$ ile temsil edersek, hedef $A$ değerini küçültmektir. Daha az açık servis, daha az gereksiz yetki ve daha iyi izleme; daha düşük risk demektir.</p>

<h2 id="etik-hackingin-altın-kuralları">Etik Hacking’in Altın Kuralları</h2>

<p>Etik hacking’in kalbinde izin vardır. Yazılı kapsam olmadan yapılan test, teknik olarak başarılı olsa bile profesyonel değildir. Bu nedenle bir güvenlik çalışması başlamadan önce kapsam, süre, hedef sistemler, veri hassasiyeti ve raporlama biçimi netleştirilmelidir.</p>

<table>
  <thead>
    <tr>
      <th>İlke</th>
      <th>Açıklama</th>
      <th>Pratik Karşılığı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Yetki</td>
      <td>Test için açık izin gerekir</td>
      <td>Yazılı sözleşme veya görev tanımı</td>
    </tr>
    <tr>
      <td>Kapsam</td>
      <td>Hangi sistemlerin test edileceği bellidir</td>
      <td>IP, alan adı, uygulama listesi</td>
    </tr>
    <tr>
      <td>Zarar vermeme</td>
      <td>Hizmet sürekliliği korunur</td>
      <td>Kontrollü test, düşük riskli doğrulama</td>
    </tr>
    <tr>
      <td>Raporlama</td>
      <td>Bulgular anlaşılır sunulur</td>
      <td>Etki, kanıt, çözüm önerisi</td>
    </tr>
  </tbody>
</table>

<h2 id="kali-ile-güvenli-laboratuvar-mantığı">Kali ile Güvenli Laboratuvar Mantığı</h2>

<p>Kali öğrenmenin en sağlıklı yolu, izole bir laboratuvar kurmaktır. Sanal makineler, bilerek zayıf bırakılmış eğitim sistemleri ve yerel ağ simülasyonları bu iş için idealdir. Böylece gerçek dünyadaki kavramları hukuki risk almadan deneyimlersin.</p>

<p>Aşağıdaki örnek, bir test çalışmasına başlamadan önce basit bir günlük dosyası oluşturarak disiplinli kayıt tutma alışkanlığını gösterir. Buradaki amaç saldırı yapmak değil, profesyonel süreç yönetimini anlamaktır.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/bin/bash</span>
<span class="c"># Etik test oturumu için basit kayıt başlangıcı</span>
<span class="c"># Yalnızca izinli laboratuvar ortamlarında kullanılmalıdır</span>

<span class="nv">LOG</span><span class="o">=</span><span class="s1">'test-oturumu.log'</span>
<span class="nb">echo</span> <span class="s1">'Etik güvenlik testi başlatıldı'</span> <span class="o">&gt;&gt;</span> <span class="nv">$LOG</span>
<span class="nb">date</span> <span class="o">&gt;&gt;</span> <span class="nv">$LOG</span>
<span class="nb">echo</span> <span class="s1">'Kapsam: yerel laboratuvar ağı'</span> <span class="o">&gt;&gt;</span> <span class="nv">$LOG</span>
<span class="nb">echo</span> <span class="s1">'Amaç: yapılandırma hatalarını belgelemek'</span> <span class="o">&gt;&gt;</span> <span class="nv">$LOG</span>
</code></pre></div></div>

<p>Bu küçük betik bile önemli bir fikri anlatır: Profesyonel güvenlik çalışması iz bırakır, kayıt tutar ve hesap verebilir olur. Etik hacker’ın farkı, yalnızca bulmak değil; bulduğunu sorumlu biçimde yönetmektir.</p>

<h2 id="araç-çalıştırmak-ile-uzmanlık-arasındaki-fark">“Araç Çalıştırmak” ile “Uzmanlık” Arasındaki Fark</h2>

<p>Kali’de bir aracın çıktısını görmek kolaydır; zor olan çıktıyı yorumlamaktır. Bir portun açık olması tek başına zafiyet değildir. Bir yazılım sürümü eski görünebilir ama arka port yamalarıyla güvenli hale getirilmiş olabilir. Bu yüzden uzman, her bulguyu bağlam içinde değerlendirir.</p>

<p>Burada analitik düşünme devreye girer. Bir bulgunun değeri; doğrulanabilirlik, sömürülebilirlik ve iş etkisiyle birlikte ele alınır. Yani güvenlik uzmanı sadece “ne buldum?” diye sormaz; “bu bulgu gerçekten ne kadar önemli ve nasıl güvenli biçimde düzeltilir?” diye sorar.</p>

<h2 id="sonuç-kali-bir-pusula-etik-ise-haritadır">Sonuç: Kali Bir Pusula, Etik ise Haritadır</h2>

<p>Kali Linux, siber güvenlik uzmanına saldırganın gözlüğünü ödünç verir; fakat yönü etik belirler. Amaç sistemleri kırmak değil, kırılmadan önce güçlendirmektir. Bu nedenle Kali öğrenmek, komut ezberlemekten çok daha fazlasıdır: risk modellemeyi, kapsam yönetimini, raporlamayı, sorumluluğu ve hukuki sınırları kavramaktır.</p>

<p>Doğru felsefeyle kullanıldığında Kali, dijital dünyanın yangın tatbikatı gibidir. Bir kriz çıkmadan önce zayıf noktaları gösterir, ekipleri hazırlar ve güvenliği ölçülebilir hale getirir. Kısacası etik hacking, teknolojinin karanlık tarafı değil; bilinçli savunmanın en parlak araçlarından biridir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="Kali Linux" /><category term="Etik Hacking" /><category term="Siber Güvenlik" /><summary type="html"><![CDATA[Kali Linux, çoğu kişinin aklına kapüşonlu hacker sahneleri getirse de gerçekte bir “sihirli saldırı kutusu” değil; güvenlik uzmanlarının sistemleri kontrollü, izinli ve ölçülebilir biçimde test etmesi için hazırlanmış bir ofansif güvenlik laboratuvarıdır. Felsefesi basittir: Bir açığı kötü niyetli biri keşfetmeden önce sen bul, kanıtla, raporla ve kapatılmasını sağla.]]></summary></entry><entry><title type="html">Kali Linux Kurulumu ve Live USB Kullanımı: Diske Yerleşmek mi, İz Bırakmadan Gezmek mi?</title><link href="https://sonsuzus.github.io/posts/kali-linux-kurulumu-ve-live-usb-kullanimi-diske-yerlesmek-mi-iz-birakmadan-gezmek-mi/" rel="alternate" type="text/html" title="Kali Linux Kurulumu ve Live USB Kullanımı: Diske Yerleşmek mi, İz Bırakmadan Gezmek mi?" /><published>2026-07-26T00:00:00+00:00</published><updated>2026-07-26T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/kali-linux-kurulumu-ve-live-usb-kullanimi-diske-yerlesmek-mi-iz-birakmadan-gezmek-mi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/kali-linux-kurulumu-ve-live-usb-kullanimi-diske-yerlesmek-mi-iz-birakmadan-gezmek-mi/"><![CDATA[<p>Kali Linux, siber güvenlik araçlarıyla dolu bir İsviçre çakısı gibidir; ama bu çakıyı cebine kalıcı olarak mı koyacaksın, yoksa gerektiğinde USB’den çıkarıp kullanacak mısın? Bu yazıda Kali’yi diske kurma ve canlı sistem olarak çalıştırma seçeneklerini teorik altyapısıyla inceleyeceğiz. Ama küçük not: Kali güçlü araçlar içerir; yalnızca kendi sistemlerinde, izinli laboratuvarlarda ve etik amaçlarla kullanılmalıdır.
``</p>

<h2 id="kurulum-mantığı-i̇şletim-sistemi-nereye-yaşar">Kurulum Mantığı: İşletim Sistemi Nereye Yaşar?</h2>

<p>Bir işletim sistemi çalışırken çekirdek, dosya sistemi, kullanıcı alanı programları ve donanım sürücülerini birlikte yönetir. Kalıcı kurulumda bu bileşenler diskteki bölümlere yazılır. Live kullanımda ise sistem çoğunlukla USB’den okunur ve RAM üzerinde çalışır.</p>

<p>Basitçe düşünürsek performans ve kalıcılık ilişkisi şöyle modellenebilir: $Deneyim = f(Hız, Kalıcılık, Taşınabilirlik)$. Kalıcı kurulumda $Hız$ ve $Kalıcılık$ artarken, live sistemde $Taşınabilirlik$ ve iz bırakmama avantajı öne çıkar.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Kalıcı Kurulum</th>
      <th>Live USB</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Veri kalıcılığı</td>
      <td>Varsayılan olarak var</td>
      <td>Genelde yok, persistence ile eklenebilir</td>
    </tr>
    <tr>
      <td>Performans</td>
      <td>Daha yüksek</td>
      <td>USB hızına bağlı</td>
    </tr>
    <tr>
      <td>Risk</td>
      <td>Disk bölümleri etkilenebilir</td>
      <td>Ana diske dokunmadan çalışabilir</td>
    </tr>
    <tr>
      <td>Kullanım amacı</td>
      <td>Günlük lab, eğitim, sürekli çalışma</td>
      <td>Hızlı test, taşınabilir analiz, geçici oturum</td>
    </tr>
  </tbody>
</table>

<h2 id="iso-dosyasını-doğrulamak">ISO Dosyasını Doğrulamak</h2>

<p>Kuruluma başlamadan önce Kali ISO dosyasının bozulmadığını doğrulamak önemlidir. Hash kontrolü, dosyanın parmak izi gibidir. Eğer indirilen dosyanın özeti beklenen değerle aynıysa, $H_{indirilen} = H_{resmi}$ koşulu sağlanır.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sha256sum </span>kali-linux.iso
</code></pre></div></div>

<p>Bu komut ISO dosyasının SHA-256 özetini üretir. Kali’nin resmi sitesindeki değerle karşılaştırarak indirme sırasında hata veya oynama olup olmadığını anlayabilirsin.</p>

<h2 id="live-usb-hazırlama">Live USB Hazırlama</h2>

<p>Live USB için en pratik araçlar Rufus, Balena Etcher veya Linux tarafında dd komutudur. dd güçlüdür ama dikkatsiz kullanılırsa yanlış diski silebilir; yani Linux dünyasının motorlu testeresi diyebiliriz.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo dd </span><span class="k">if</span><span class="o">=</span>kali-linux.iso <span class="nv">of</span><span class="o">=</span>/dev/sdX <span class="nv">bs</span><span class="o">=</span>4M <span class="nv">status</span><span class="o">=</span>progress <span class="nv">oflag</span><span class="o">=</span><span class="nb">sync</span>
</code></pre></div></div>

<p>Burada if kaynak ISO dosyasını, of hedef USB aygıtını belirtir. /dev/sdX yerine doğru USB aygıtı yazılmalıdır. Bu komut ISO içeriğini USB’ye ham biçimde yazar ve USB’yi önyüklenebilir hale getirir.</p>

<h2 id="live-sistem-kullanımı">Live Sistem Kullanımı</h2>

<p>Bilgisayarı USB’den başlatmak için BIOS veya UEFI menüsünden boot sırası değiştirilir. Kali açılış menüsünde Live seçeneği seçildiğinde sistem RAM üzerinde çalışır. Bu modda yaptığın çoğu değişiklik yeniden başlatınca kaybolur. Bu, gizemli bir ninja gibi gelip gitmek isteyenler için idealdir.</p>

<p>Ancak bazı durumlarda notları, araç ayarlarını veya raporları saklamak isteyebilirsin. Bunun için persistence bölümü oluşturulur. Mantık şudur: sistem live çalışır ama belirli bir USB bölümü kalıcı depo gibi bağlanır.</p>

<table>
  <thead>
    <tr>
      <th>Live Mod</th>
      <th>Ne Zaman Mantıklı?</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Standart Live</td>
      <td>İz bırakmadan hızlı test</td>
    </tr>
    <tr>
      <td>Live Persistence</td>
      <td>USB üzerinde ayar ve dosya saklama</td>
    </tr>
    <tr>
      <td>Forensic Mode</td>
      <td>Diskleri otomatik bağlamadan inceleme</td>
    </tr>
  </tbody>
</table>

<h2 id="kalıcı-kurulum-süreci">Kalıcı Kurulum Süreci</h2>

<p>Kalıcı kurulumda Kali disk üzerine yazılır. Bu yöntem sanal makinede ya da ayrı bir test bilgisayarında daha güvenlidir. Kurulum adımları genel olarak dil, klavye, ağ, kullanıcı, disk bölümlendirme ve önyükleyici seçiminden oluşur.</p>

<p>Disk bölümlendirme en kritik aşamadır. Tüm diski kullan seçeneği basittir ama mevcut verileri silebilir. Çift işletim sistemi kurulacaksa boş alan ayırmak gerekir. Linux tarafında temel bölümler genelde kök dizin /, isteğe bağlı /home ve takas alanıdır. Takas için eski pratik kural $Swap \approx RAM$ olsa da modern sistemlerde kullanım senaryosu daha belirleyicidir.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>lsblk
</code></pre></div></div>

<p>Bu komut diskleri ve bölümleri listeler. Kurulumdan önce hangi diskin hangisi olduğunu görmek için çok faydalıdır. Yanlış diske kurulum yapmak, kahveyi klavyeye dökmek kadar üzücü olabilir.</p>

<h2 id="hangisini-seçmeli">Hangisini Seçmeli?</h2>

<p>Eğer Kali’yi öğreniyor, araçları düzenli kullanıyor ve laboratuvar ortamı kuruyorsan kalıcı kurulum veya sanal makine daha konforludur. Eğer amacın taşınabilir analiz, geçici oturum veya ana sisteme dokunmadan deneme yapmaksa Live USB daha akıllıca olabilir.</p>

<p>Özetle: kalıcı kurulum ev kurmak, Live USB ise kamp çadırı taşımak gibidir. Ev rahattır ama yer ister; çadır hafiftir ama her sabah yeniden toparlanırsın. En güvenli başlangıç ise çoğu kullanıcı için sanal makine ya da Live USB ile deneme yapmak, ardından ihtiyaç netleşince kalıcı kuruluma geçmektir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="Kali Linux" /><category term="Live USB" /><category term="Linux Kurulumu" /><summary type="html"><![CDATA[Kali Linux, siber güvenlik araçlarıyla dolu bir İsviçre çakısı gibidir; ama bu çakıyı cebine kalıcı olarak mı koyacaksın, yoksa gerektiğinde USB’den çıkarıp kullanacak mısın? Bu yazıda Kali’yi diske kurma ve canlı sistem olarak çalıştırma seçeneklerini teorik altyapısıyla inceleyeceğiz. Ama küçük not: Kali güçlü araçlar içerir; yalnızca kendi sistemlerinde, izinli laboratuvarlarda ve etik amaçlarla kullanılmalıdır.]]></summary></entry><entry><title type="html">Parola Özetlerini Anlamak: Hashcat ve John the Ripper ile Güvenli Laboratuvar</title><link href="https://sonsuzus.github.io/posts/parola-ozetlerini-anlamak-hashcat-ve-john-the-ripper-ile-guvenli-laboratuvar/" rel="alternate" type="text/html" title="Parola Özetlerini Anlamak: Hashcat ve John the Ripper ile Güvenli Laboratuvar" /><published>2026-07-26T00:00:00+00:00</published><updated>2026-07-26T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/parola-ozetlerini-anlamak-hashcat-ve-john-the-ripper-ile-guvenli-laboratuvar</id><content type="html" xml:base="https://sonsuzus.github.io/posts/parola-ozetlerini-anlamak-hashcat-ve-john-the-ripper-ile-guvenli-laboratuvar/"><![CDATA[<p>Parolalar çoğu sistemde doğrudan saklanmaz; bunun yerine tek yönlü bir fonksiyondan geçirilerek elde edilen özetler saklanır. Parola denetimi ya da kurtarma çalışmaları, tahmin edilen adayların özetlerini hesaplayıp kayıtlı değerle karşılaştırır. Hashcat ve John the Ripper bu işlemi hızlandıran güçlü araçlardır; ancak yalnızca sahibi olduğunuz veya test izni aldığınız sistemlerde kullanılmalıdır. Aksi hâlde eğitici görünen bir deneme, hukuki sonuçları olan yetkisiz erişime dönüşebilir.</p>

<p>``</p>

<h2 id="hash-şifreleme-değildir">Hash şifreleme değildir</h2>

<p>Şifreleme, doğru anahtarla geri çevrilebilir. Güvenli bir parola özeti ise tek yönlüdür: Araçlar özeti matematiksel olarak “çözmez”; olası parolaları deneyerek eşleşme arar. Basitleştirilmiş süreç şöyledir:</p>

\[h = H(p, s)\]

<p>Burada $p$ parola, $s$ salt ve $H$ özetleme veya parola türetme fonksiyonudur. Bir aday $p’$ için $H(p’,s)=h$ olduğunda parola bulunmuş sayılır. Salt, aynı parolaların farklı özetler üretmesini sağlar ve önceden hazırlanmış gökkuşağı tablolarının etkisini azaltır.</p>

<p>Bir saldırının yaklaşık süresi şu şekilde düşünülebilir:</p>

\[T \approx \frac{N}{R}\]

<p>$N$ aday sayısını, $R$ ise saniyede denenebilen aday sayısını gösterir. Sekiz karakterli ve 62 sembollü bir uzayda $N=62^8$ olur. Hızlı algoritmalar saldırganın işini kolaylaştırırken Argon2id gibi bilinçli olarak yavaş ve bellek maliyetli fonksiyonlar deneme hızını düşürür.</p>

<table>
  <thead>
    <tr>
      <th>Yöntem</th>
      <th>Mantık</th>
      <th>Güçlü yanı</th>
      <th>Zayıf yanı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Sözlük</td>
      <td>Listedeki adayları dener</td>
      <td>Yaygın parolalarda hızlıdır</td>
      <td>Rastgele parolalarda başarısızdır</td>
    </tr>
    <tr>
      <td>Kural tabanlı</td>
      <td>Kelimeleri sayılar ve eklerle değiştirir</td>
      <td>İnsan alışkanlıklarını yakalar</td>
      <td>Aday sayısı hızla büyür</td>
    </tr>
    <tr>
      <td>Maske</td>
      <td>Bilinen karakter yapısını tarar</td>
      <td>Biçim biliniyorsa verimlidir</td>
      <td>Uzunluk arttıkça pahalılaşır</td>
    </tr>
    <tr>
      <td>Kaba kuvvet</td>
      <td>Tüm uzayı araştırır</td>
      <td>Teorik olarak kapsamlıdır</td>
      <td>Üstel büyüme nedeniyle yavaştır</td>
    </tr>
  </tbody>
</table>

<h2 id="güvenli-bir-laboratuvar">Güvenli bir laboratuvar</h2>

<p>Aşağıdaki örnekler yalnızca kendi ürettiğiniz deneme verileri için kullanılmalıdır. Önce zararsız bir laboratuvar parolasının SHA-256 özetini oluşturalım:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">printf</span> <span class="s1">'Laboratuvar42!'</span> | <span class="nb">sha256sum</span>
</code></pre></div></div>

<p>Çıktıdaki özet değerini <code class="language-plaintext highlighter-rouge">hash.txt</code> dosyasına, içinde <code class="language-plaintext highlighter-rouge">Laboratuvar42!</code> satırı bulunan küçük eğitim listesini ise <code class="language-plaintext highlighter-rouge">adaylar.txt</code> dosyasına kaydedebilirsiniz. Hashcat ile sözlük denetimi:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hashcat <span class="nt">-m</span> 1400 <span class="nt">-a</span> 0 hash.txt adaylar.txt
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">-m 1400</code> SHA-256 türünü, <code class="language-plaintext highlighter-rouge">-a 0</code> sözlük modunu belirtir. John the Ripper için dosya biçimini açıkça seçmek yanlış algılama riskini azaltır:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>john <span class="nt">--format</span><span class="o">=</span>raw-sha256 <span class="nt">--wordlist</span><span class="o">=</span>adaylar.txt hash.txt
john <span class="nt">--show</span> <span class="nt">--format</span><span class="o">=</span>raw-sha256 hash.txt
</code></pre></div></div>

<p>İlk komut adayları karşılaştırır, ikincisi laboratuvarda bulunan eşleşmeyi gösterir. Gerçek parola verilerini çevrim içi hizmetlere yüklememek, deneme dosyalarını iş bitince silmek ve sonuçları yetkilendirilmiş raporlarda tutmak önemlidir.</p>

<h2 id="araçların-rolleri">Araçların rolleri</h2>

<table>
  <thead>
    <tr>
      <th>Araç</th>
      <th>Öne çıkan özellik</th>
      <th>Uygun kullanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Hashcat</td>
      <td>GPU hızlandırma ve ayrıntılı saldırı modları</td>
      <td>Kontrollü performans testleri</td>
    </tr>
    <tr>
      <td>John the Ripper</td>
      <td>Esnek biçim algılama ve kurallar</td>
      <td>Denetim ve eğitim laboratuvarları</td>
    </tr>
  </tbody>
</table>

<p>Başarıyla bulunan parola, aracın “sihirli” olduğunu değil, parolanın tahmin edilebilir veya saklama yönteminin yetersiz olduğunu gösterir. Savunmada Argon2id, scrypt ya da bcrypt gibi uygun maliyet parametrelerine sahip fonksiyonlar; benzersiz salt, parola yöneticisi, uzun ve benzersiz parolalar, hız sınırlaması ve çok faktörlü kimlik doğrulama birlikte kullanılmalıdır. Ayrıca eski MD5 ve SHA-1 özetleri yalnızca yeniden hashlenmemeli; kullanıcı doğrulandıktan sonra modern algoritmaya güvenli biçimde taşınmalıdır. En iyi parola kırma deneyi, sonunda daha sağlam bir sistemi doğuran deneydir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="siber güvenlik" /><category term="hashcat" /><category term="john the ripper" /><summary type="html"><![CDATA[Parolalar çoğu sistemde doğrudan saklanmaz; bunun yerine tek yönlü bir fonksiyondan geçirilerek elde edilen özetler saklanır. Parola denetimi ya da kurtarma çalışmaları, tahmin edilen adayların özetlerini hesaplayıp kayıtlı değerle karşılaştırır. Hashcat ve John the Ripper bu işlemi hızlandıran güçlü araçlardır; ancak yalnızca sahibi olduğunuz veya test izni aldığınız sistemlerde kullanılmalıdır. Aksi hâlde eğitici görünen bir deneme, hukuki sonuçları olan yetkisiz erişime dönüşebilir.]]></summary></entry><entry><title type="html">Sızma ve Metasploit Framework: Zafiyetten Kontrollü Erişime</title><link href="https://sonsuzus.github.io/posts/sizma-ve-metasploit-framework-zafiyetten-kontrollu-erisime/" rel="alternate" type="text/html" title="Sızma ve Metasploit Framework: Zafiyetten Kontrollü Erişime" /><published>2026-07-26T00:00:00+00:00</published><updated>2026-07-26T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/sizma-ve-metasploit-framework-zafiyetten-kontrollu-erisime</id><content type="html" xml:base="https://sonsuzus.github.io/posts/sizma-ve-metasploit-framework-zafiyetten-kontrollu-erisime/"><![CDATA[<p>Bir zafiyetin tespit edilmesi, sistemin gerçekten ele geçirilebildiği anlamına gelmez; yalnızca araştırılması gereken bir kapı bulunduğunu gösterir. Sızma, bu kapının yetkili ve izole bir laboratuvar ortamında kontrollü biçimde açılmasıdır. Metasploit Framework ise hazır istismar modülleri, payload seçenekleri ve oturum yönetimiyle bu süreci standartlaştıran güçlü bir güvenlik test platformudur.</p>

<p>``</p>

<h2 id="i̇stismar-sürecinin-teorik-temeli">İstismar sürecinin teorik temeli</h2>

<p>Bir istismar, hedef yazılımdaki hatayı sistem davranışını değiştirmek için kullanır. Basitleştirilmiş risk modeli şöyle düşünülebilir:</p>

\[R = O \times E \times I\]

<p>Burada $O$ zafiyetin oluşma olasılığını, $E$ istismar edilebilirliği, $I$ ise muhtemel etkiyi temsil eder. Metasploit çoğunlukla $E$ değerinin pratik olarak doğrulanmasına yardımcı olur. Başarılı bir sonuç, riskin otomatik olarak kritik olduğu anlamına gelmez; erişilen yetki, ağ konumu ve veri etkisi ayrıca değerlendirilmelidir.</p>

<p>Metasploit ekosisteminin temel parçaları şunlardır:</p>

<table>
  <thead>
    <tr>
      <th>Bileşen</th>
      <th>Görevi</th>
      <th>Örnek kullanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Exploit</td>
      <td>Zafiyeti tetikler</td>
      <td>Hatalı serviste kod yürütme</td>
    </tr>
    <tr>
      <td>Payload</td>
      <td>Başarı sonrası davranışı belirler</td>
      <td>Kontrollü oturum açma</td>
    </tr>
    <tr>
      <td>Auxiliary</td>
      <td>Tarama ve yardımcı işlemler yapar</td>
      <td>Sürüm doğrulama</td>
    </tr>
    <tr>
      <td>Encoder</td>
      <td>Bayt biçimini dönüştürür</td>
      <td>Uyumluluk sağlama</td>
    </tr>
    <tr>
      <td>Post</td>
      <td>Açılmış oturumda test yapar</td>
      <td>Yetki ve sistem bilgisi kontrolü</td>
    </tr>
  </tbody>
</table>

<p>Exploit kapıyı açan mekanizma, payload ise kapı açıldıktan sonra yapılacak iştir. Bu ayrım, yanlış payload seçildiğinde exploit doğru olsa bile neden oturum alınamadığını açıklar.</p>

<h2 id="güvenli-laboratuvarın-hazırlanması">Güvenli laboratuvarın hazırlanması</h2>

<p>Testler yalnızca açık izin bulunan sistemlerde gerçekleştirilmelidir. Örnek senaryoda saldırı makinesi olarak Kali Linux, hedef olarak özellikle savunmasız bırakılmış Metasploitable 2 kullanılabilir. İki sanal makineyi <strong>host-only</strong> ağa bağlamak, internet erişimini kapatmak ve işlem öncesinde anlık görüntü almak önemlidir.</p>

<table>
  <thead>
    <tr>
      <th>Ağ türü</th>
      <th style="text-align: right">İnternet erişimi</th>
      <th>Laboratuvar için uygunluk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Bridged</td>
      <td style="text-align: right">Var</td>
      <td>Riskli</td>
    </tr>
    <tr>
      <td>NAT</td>
      <td style="text-align: right">Genellikle var</td>
      <td>Sınırlı</td>
    </tr>
    <tr>
      <td>Host-only</td>
      <td style="text-align: right">Yok</td>
      <td>Önerilen</td>
    </tr>
  </tbody>
</table>

<p>Aşağıdaki komut Metasploit konsolunu başlatır:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>msfconsole
</code></pre></div></div>

<p>Hedef laboratuvarda eski <code class="language-plaintext highlighter-rouge">vsftpd 2.3.4</code> servisi bulunduğu önceden doğrulanmışsa ilgili eğitim modülü incelenebilir:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>search vsftpd 2.3.4
use exploit/unix/ftp/vsftpd_234_backdoor
info
show options
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">search</code> uygun modülleri listeler, <code class="language-plaintext highlighter-rouge">use</code> modülü seçer, <code class="language-plaintext highlighter-rouge">info</code> açıklama ve referansları gösterir. Modülü hemen çalıştırmak yerine dokümantasyonu okumak; desteklenen sürümü, yan etkileri ve gerekli seçenekleri anlamayı sağlar.</p>

<h2 id="kontrollü-doğrulama">Kontrollü doğrulama</h2>

<p>Yalnızca izole hedefin IP adresi tanımlanır. Aşağıdaki adres örnektir ve özel laboratuvar aralığındadır:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>set RHOSTS 192.168.56.20
set RPORT 21
check
run
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">check</code>, modül destekliyorsa hedefin istismara uygunluğunu oturum açmadan değerlendirmeye çalışır. <code class="language-plaintext highlighter-rouge">run</code> ise istismarı başlatır. Başarılı bir kabuk oluştuğunda kapsamı büyütmeden yalnızca kimlik doğrulaması yapılabilir:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">id
uname</span> <span class="nt">-a</span>
<span class="nb">exit</span>
</code></pre></div></div>

<p>Bu komutlar erişilen kullanıcıyı ve işletim sistemi bilgisini gösterir; veri değiştirmez. Kanıt için zaman damgası, modül adı, hedef sürümü ve elde edilen yetki seviyesi kaydedilmelidir. Parola dosyalarını okumak, kalıcılık kurmak veya başka sistemlere sıçramak doğrulama için gerekli değildir.</p>

<h2 id="sonuçların-yorumlanması">Sonuçların yorumlanması</h2>

<p>Başarısızlık da değerlidir: servis yamalı olabilir, sürüm tespiti hatalı çıkabilir veya ağ filtresi bağlantıyı engelleyebilir. Bulguda kullanılan modül, ön koşullar, gözlenen çıktı, etki ve düzeltme önerisi açıkça yazılmalıdır. Son aşamada oturumlar kapatılmalı, sanal makine anlık görüntüye döndürülmeli ve kayıtlar güvenli biçimde saklanmalıdır. Metasploit’in gerçek gücü “tek tuşla saldırı” değil; tekrarlanabilir, ölçülebilir ve etik sınırlar içindeki güvenlik doğrulamasıdır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="Metasploit" /><category term="Sızma Testi" /><category term="Siber Güvenlik" /><summary type="html"><![CDATA[Bir zafiyetin tespit edilmesi, sistemin gerçekten ele geçirilebildiği anlamına gelmez; yalnızca araştırılması gereken bir kapı bulunduğunu gösterir. Sızma, bu kapının yetkili ve izole bir laboratuvar ortamında kontrollü biçimde açılmasıdır. Metasploit Framework ise hazır istismar modülleri, payload seçenekleri ve oturum yönetimiyle bu süreci standartlaştıran güçlü bir güvenlik test platformudur.]]></summary></entry><entry><title type="html">Web Uygulama Güvenliği Analizi: Burp Suite ve OWASP ZAP ile Zayıflık Avı</title><link href="https://sonsuzus.github.io/posts/web-uygulama-guvenligi-analizi-burp-suite-ve-owasp-zap-ile-zayiflik-avi/" rel="alternate" type="text/html" title="Web Uygulama Güvenliği Analizi: Burp Suite ve OWASP ZAP ile Zayıflık Avı" /><published>2026-07-26T00:00:00+00:00</published><updated>2026-07-26T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/web-uygulama-guvenligi-analizi-burp-suite-ve-owasp-zap-ile-zayiflik-avi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/web-uygulama-guvenligi-analizi-burp-suite-ve-owasp-zap-ile-zayiflik-avi/"><![CDATA[<p>Bir web uygulamasını güvenli sanmak, kapıyı kilitleyip pencereyi açık bırakmaya benzer. Burp Suite ve OWASP ZAP gibi proxy araçları, tarayıcı ile sunucu arasına oturarak HTTP trafiğini görünür kılar; böylece SQL enjeksiyonu, XSS ve yetkilendirme hataları gibi mimari zayıflıkları kontrollü ve izinli ortamlarda analiz edebiliriz.
``
Önce etik sınırı kalın çizelim: Bu araçlar yalnızca kendi sistemlerinizde, eğitim laboratuvarlarında veya açıkça yetki verilen testlerde kullanılmalıdır. Amaç “bir siteyi kırmak” değil, yazılımın hangi varsayımlar üzerine kurulduğunu görmek ve o varsayımlar bozulduğunda neler olabileceğini anlamaktır.</p>

<p>Proxy mantığı basittir: Tarayıcınız isteği doğrudan sunucuya göndermek yerine Burp veya ZAP’a yollar. Araç, isteği yakalar, başlıkları, çerezleri, gövdeyi ve parametreleri gösterir. İsterseniz isteği değiştirmeden geçirir, isterseniz test ortamında varyasyonlar deneyerek uygulamanın davranışını gözlemlersiniz. Bu, yazılımcı için adeta “HTTP mikroskobu”dur.</p>

<p>Web güvenliğinde risk çoğu zaman şu sezgisel modelle düşünülür: $Risk = Olasılık \times Etki$. Bir açık çok kolay tetikleniyor ama etkisi düşükse orta risk olabilir; nadir tetiklenen fakat veritabanı sızıntısına yol açan bir hata ise kritik sayılabilir. Proxy araçları bu iki değişkeni ölçmemize yardım eder: Hata tekrar üretilebiliyor mu, hangi veri etkileniyor, kimlik doğrulama atlanıyor mu?</p>

<table>
  <thead>
    <tr>
      <th>Araç</th>
      <th>Güçlü Yanı</th>
      <th>Tipik Kullanım</th>
      <th>Not</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Burp Suite</td>
      <td>Manuel test akışı ve eklenti ekosistemi</td>
      <td>İstek yakalama, tekrar gönderme, oturum analizi</td>
      <td>Community sürümü öğrenmek için yeterlidir</td>
    </tr>
    <tr>
      <td>OWASP ZAP</td>
      <td>Açık kaynak ve otomasyon dostu yapı</td>
      <td>Pasif tarama, CI/CD güvenlik kontrolleri</td>
      <td>Başlangıç için çok erişilebilirdir</td>
    </tr>
    <tr>
      <td>Tarayıcı DevTools</td>
      <td>Hızlı istemci tarafı inceleme</td>
      <td>DOM, network ve console analizi</td>
      <td>Proxy kadar derin manipülasyon sunmaz</td>
    </tr>
  </tbody>
</table>

<p>SQL enjeksiyonunun kökü, kullanıcı girdisinin SQL komutunun parçası gibi ele alınmasıdır. Yani veri ile komut ayrımı kaybolur. Güvensiz bir yaklaşım şu şekilde görünür:</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Eğitim amaçlı kötü örnek: kullanıcı girdisi sorguya doğrudan ekleniyor</span>
<span class="kd">const</span> <span class="nx">userId</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">query</span><span class="p">.</span><span class="nx">id</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">sql</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">SELECT * FROM users WHERE id = </span><span class="dl">'</span> <span class="o">+</span> <span class="nx">userId</span><span class="p">;</span>
<span class="nx">db</span><span class="p">.</span><span class="nf">query</span><span class="p">(</span><span class="nx">sql</span><span class="p">);</span>
</code></pre></div></div>

<p>Burada uygulama, <code class="language-plaintext highlighter-rouge">id</code> değerinin gerçekten sayı olduğunu varsayar. Oysa güvenli tasarımda sorgu şablonu ile veri ayrı taşınmalıdır:</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Daha güvenli yaklaşım: parametreli sorgu</span>
<span class="kd">const</span> <span class="nx">userId</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">query</span><span class="p">.</span><span class="nx">id</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">sql</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">SELECT * FROM users WHERE id = ?</span><span class="dl">'</span><span class="p">;</span>
<span class="nx">db</span><span class="p">.</span><span class="nf">query</span><span class="p">(</span><span class="nx">sql</span><span class="p">,</span> <span class="p">[</span><span class="nx">userId</span><span class="p">]);</span>
</code></pre></div></div>

<p>Parametreli sorgular, veriyi komut olarak yorumlamaz. Ek olarak giriş doğrulama, en az yetkili veritabanı kullanıcısı, ayrıntılı hata mesajlarını kapatma ve log analizi savunmayı güçlendirir.</p>

<p>XSS tarafında problem, kullanıcının sağladığı verinin HTML, JavaScript veya URL bağlamında güvenli biçimde kodlanmadan sayfaya basılmasıdır. Saklanan XSS yorum alanında kalıcı olabilir; yansıyan XSS URL parametresinden dönebilir; DOM tabanlı XSS ise tarayıcıdaki JavaScript’in veriyi yanlış işlemesiyle doğar.</p>

<table>
  <thead>
    <tr>
      <th>Saldırı Vektörü</th>
      <th>Temel Hata</th>
      <th>Savunma</th>
      <th>Proxy ile Gözlem</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>SQLi</td>
      <td>Veri-komut ayrımının bozulması</td>
      <td>Parametreli sorgu, doğrulama</td>
      <td>Parametre değişince hata/yanıt farkı</td>
    </tr>
    <tr>
      <td>XSS</td>
      <td>Çıktının bağlama göre kodlanmaması</td>
      <td>HTML escape, CSP, şablon motoru güvenliği</td>
      <td>Yanıtta girdinin nerede göründüğü</td>
    </tr>
    <tr>
      <td>Yetki hatası</td>
      <td>Kimlik ile izin kontrolünün karışması</td>
      <td>Sunucu tarafı erişim kontrolü</td>
      <td>Çerez veya ID değişiminde davranış</td>
    </tr>
  </tbody>
</table>

<p>Burp veya ZAP ile iyi bir analiz akışı şöyle kurulabilir: Önce uygulamada normal kullanıcı gibi gezinip trafik haritası çıkarılır. Sonra pasif bulgular incelenir: eksik güvenlik başlıkları, güvensiz çerez bayrakları, fazla konuşkan hata mesajları. Ardından yalnızca test ortamında, belirli parametrelerin sunucu davranışını nasıl değiştirdiği gözlenir. Bulgular “kanıt, etki, çözüm” formatında raporlanır.</p>

<p>Mimari açıdan en önemli ders şudur: Güvenlik, sonradan eklenen bir eklenti değil, veri akışının tasarım ilkesidir. Her giriş şüphelidir, her çıktı bağlama göre kodlanmalıdır, her erişim sunucuda doğrulanmalıdır. Proxy araçları ise bu prensiplerin gerçekten uygulanıp uygulanmadığını görmemizi sağlayan eğlenceli ama ciddi laboratuvar arkadaşlarıdır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="web-guvenligi" /><category term="burp-suite" /><category term="owasp-zap" /><category term="sqli" /><category term="xss" /><summary type="html"><![CDATA[Bir web uygulamasını güvenli sanmak, kapıyı kilitleyip pencereyi açık bırakmaya benzer. Burp Suite ve OWASP ZAP gibi proxy araçları, tarayıcı ile sunucu arasına oturarak HTTP trafiğini görünür kılar; böylece SQL enjeksiyonu, XSS ve yetkilendirme hataları gibi mimari zayıflıkları kontrollü ve izinli ortamlarda analiz edebiliriz.]]></summary></entry><entry><title type="html">Zafiyet Analizi: Nessus ve OpenVAS ile Güvenlik Açıklarını Avlamak</title><link href="https://sonsuzus.github.io/posts/zafiyet-analizi-nessus-ve-openvas-ile-guvenlik-aciklarini-avlamak/" rel="alternate" type="text/html" title="Zafiyet Analizi: Nessus ve OpenVAS ile Güvenlik Açıklarını Avlamak" /><published>2026-07-26T00:00:00+00:00</published><updated>2026-07-26T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/zafiyet-analizi-nessus-ve-openvas-ile-guvenlik-aciklarini-avlamak</id><content type="html" xml:base="https://sonsuzus.github.io/posts/zafiyet-analizi-nessus-ve-openvas-ile-guvenlik-aciklarini-avlamak/"><![CDATA[<p>Bir ağdaki güvenlik açıklarını elle bulmaya çalışmak, karanlık bir odada LEGO parçası aramaya benzer: mutlaka bir şeye basarsın ama acı biraz geç gelir. Zafiyet analizi, Nessus veya OpenVAS gibi entegre tarayıcılarla sistemlerdeki bilinen güvenlik açıklarının otomatik tespit edilmesi, önceliklendirilmesi ve raporlanması sürecidir. Amaç saldırmak değil; saldırganlardan önce eksikleri görmek, ölçmek ve kapatmaktır.
``</p>

<h2 id="zafiyet-analizi-tam-olarak-neyi-ölçer">Zafiyet Analizi Tam Olarak Neyi Ölçer?</h2>

<p>Zafiyet, bir varlığın tehdit tarafından istismar edilebilecek zayıf noktasıdır. Bu bir eski OpenSSL sürümü, yanlış yapılandırılmış SSH servisi, varsayılan parola, açık bir yönetim paneli veya eksik güvenlik yaması olabilir. Tarayıcılar genellikle şu mantıkla çalışır: önce hedefi keşfeder, portları ve servisleri belirler, servis sürümlerini parmak iziyle tanır, sonra bunları CVE veritabanları ve test eklentileriyle eşleştirir.</p>

<p>Basit risk düşüncesi şu formülle özetlenebilir: $Risk = Olasılık \times Etki$. CVSS puanı da bu fikri standardize eder. Örneğin CVSS 9.8 olan uzaktan kod çalıştırma açığı, CVSS 4.3 olan bilgi sızıntısından genellikle daha acildir. Ancak bağlam kritiktir: internete açık bir düşük puanlı açıklık, iç ağdaki yüksek puanlı ama erişilemeyen açıklıktan daha riskli olabilir.</p>

<table>
  <thead>
    <tr>
      <th>Kavram</th>
      <th>Anlamı</th>
      <th>Pratik Etkisi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>CVE</td>
      <td>Açığın evrensel kimliği</td>
      <td>Aynı açıklığı herkes aynı adla takip eder</td>
    </tr>
    <tr>
      <td>CVSS</td>
      <td>Açığın teknik şiddet puanı</td>
      <td>Önceliklendirme için başlangıç sağlar</td>
    </tr>
    <tr>
      <td>False Positive</td>
      <td>Var sanılan ama gerçekte olmayan açık</td>
      <td>Zaman kaybettirir, doğrulama gerekir</td>
    </tr>
    <tr>
      <td>Remediation</td>
      <td>Açığı giderme aksiyonu</td>
      <td>Yama, yapılandırma veya erişim kısıtı uygulanır</td>
    </tr>
  </tbody>
</table>

<h2 id="nessus-ve-openvas-i̇ki-popüler-tarayıcı">Nessus ve OpenVAS: İki Popüler Tarayıcı</h2>

<p>Nessus, ticari dünyada güçlü eklenti ekosistemi ve kullanıcı dostu raporlarıyla bilinir. OpenVAS, Greenbone Community Edition altında açık kaynak yaklaşımıyla öne çıkar. İkisi de tarama profilleri, kimlik bilgili tarama, raporlama ve zafiyet doğrulama özellikleri sunar.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Nessus</th>
      <th>OpenVAS</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Lisans</td>
      <td>Ticari seçenekler ağırlıklı</td>
      <td>Açık kaynak topluluk sürümü mevcut</td>
    </tr>
    <tr>
      <td>Kullanım Kolaylığı</td>
      <td>Arayüz ve raporlar oldukça olgun</td>
      <td>Kurulum ve bakım biraz daha emek ister</td>
    </tr>
    <tr>
      <td>Eklenti Güncellemeleri</td>
      <td>Hızlı ve düzenli</td>
      <td>Feed güncellemelerine bağlı</td>
    </tr>
    <tr>
      <td>Uygun Senaryo</td>
      <td>Kurumsal raporlama, denetim</td>
      <td>Laboratuvar, eğitim, bütçe dostu analiz</td>
    </tr>
  </tbody>
</table>

<h2 id="tarama-süreci-nasıl-i̇lerler">Tarama Süreci Nasıl İlerler?</h2>

<p>Tipik akış dört adımdır: kapsam belirleme, tarama, doğrulama ve iyileştirme. Kapsamda hangi IP aralıklarının, alan adlarının veya uygulamaların taranacağı netleştirilir. İzinsiz tarama hukuki ve etik sorun doğurur; bu yüzden her zaman yazılı izin ve zaman penceresi belirlenmelidir.</p>

<table>
  <thead>
    <tr>
      <th>Aşama</th>
      <th>Soru</th>
      <th>Çıktı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Keşif</td>
      <td>Hangi varlıklar var?</td>
      <td>IP, port, servis listesi</td>
    </tr>
    <tr>
      <td>Eşleştirme</td>
      <td>Hangi sürüm neye açık?</td>
      <td>CVE ve bulgu listesi</td>
    </tr>
    <tr>
      <td>Önceliklendirme</td>
      <td>Önce ne kapanmalı?</td>
      <td>Kritik-yüksek-orta sıralaması</td>
    </tr>
    <tr>
      <td>Takip</td>
      <td>Açık kapandı mı?</td>
      <td>Yeniden tarama raporu</td>
    </tr>
  </tbody>
</table>

<p>Kimlik bilgili tarama özellikle değerlidir. Tarayıcı sisteme SSH, WinRM veya agent benzeri yöntemlerle giriş yapabildiğinde yalnızca dışarıdan görünen servisleri değil, kurulu paketleri, eksik yamaları ve yerel yapılandırmaları da denetler. Bu, röntgen ile fotoğraf arasındaki fark gibidir.</p>

<h2 id="raporları-makineyle-okumak">Raporları Makineyle Okumak</h2>

<p>Tarayıcıların CSV veya XML raporları otomasyon için harika malzemedir. Aşağıdaki Python örneği, CSV raporundaki bulguları CVSS puanına göre sıralar ve kritik olanları öne çıkarır. Amaç saldırı yapmak değil, iyileştirme kuyruğunu yönetmektir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">csv</span>

<span class="k">with</span> <span class="nf">open</span><span class="p">(</span><span class="sh">'</span><span class="s">vulnerability_report.csv</span><span class="sh">'</span><span class="p">,</span> <span class="n">newline</span><span class="o">=</span><span class="sh">''</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="sh">'</span><span class="s">utf-8</span><span class="sh">'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
    <span class="n">rows</span> <span class="o">=</span> <span class="nf">list</span><span class="p">(</span><span class="n">csv</span><span class="p">.</span><span class="nc">DictReader</span><span class="p">(</span><span class="n">f</span><span class="p">))</span>

<span class="n">findings</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">rows</span><span class="p">:</span>
    <span class="n">cvss</span> <span class="o">=</span> <span class="nf">float</span><span class="p">(</span><span class="n">row</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">CVSS</span><span class="sh">'</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="ow">or</span> <span class="mi">0</span><span class="p">)</span>
    <span class="n">findings</span><span class="p">.</span><span class="nf">append</span><span class="p">({</span>
        <span class="sh">'</span><span class="s">host</span><span class="sh">'</span><span class="p">:</span> <span class="n">row</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">Host</span><span class="sh">'</span><span class="p">),</span>
        <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="n">row</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">Name</span><span class="sh">'</span><span class="p">),</span>
        <span class="sh">'</span><span class="s">cvss</span><span class="sh">'</span><span class="p">:</span> <span class="n">cvss</span><span class="p">,</span>
        <span class="sh">'</span><span class="s">solution</span><span class="sh">'</span><span class="p">:</span> <span class="n">row</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">Solution</span><span class="sh">'</span><span class="p">)</span>
    <span class="p">})</span>

<span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="nf">sorted</span><span class="p">(</span><span class="n">findings</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="sh">'</span><span class="s">cvss</span><span class="sh">'</span><span class="p">],</span> <span class="n">reverse</span><span class="o">=</span><span class="bp">True</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">item</span><span class="p">[</span><span class="sh">'</span><span class="s">cvss</span><span class="sh">'</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="mf">7.0</span><span class="p">:</span>
        <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">[</span><span class="si">{</span><span class="n">item</span><span class="p">[</span><span class="sh">'</span><span class="s">cvss</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s">] </span><span class="si">{</span><span class="n">item</span><span class="p">[</span><span class="sh">'</span><span class="s">host</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s"> - </span><span class="si">{</span><span class="n">item</span><span class="p">[</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu kod, güvenlik ekibinin önce yüksek riskli bulgulara odaklanmasına yardım eder. Gerçek ortamda buna varlık kritiklik değeri de eklenebilir: $Öncelik = CVSS \times VarlıkKritikliği$. Böylece ödeme sistemi ile test sunucusu aynı kefeye konmaz.</p>

<h2 id="i̇yi-analizin-sırrı-tarayıcıya-körü-körüne-güvenmemek">İyi Analizin Sırrı: Tarayıcıya Körü Körüne Güvenmemek</h2>

<p>Zafiyet tarayıcıları çok güçlüdür ama sihirli değnek değildir. Yanlış pozitifler, eksik envanter, kapalı portlar, WAF etkisi veya hatalı kimlik bilgileri sonuçları bozabilir. Bu yüzden raporlar mutlaka doğrulanmalı, iş etkisiyle yorumlanmalı ve düzeltmeler yeniden taramayla teyit edilmelidir.</p>

<p>Sonuç olarak Nessus ve OpenVAS, güvenlik açıklarını görünür kılan radar sistemleridir. Radar düşmanı durdurmaz; ama nereden geldiğini gösterir. Düzenli tarama, doğru önceliklendirme ve disiplinli iyileştirme döngüsüyle zafiyet analizi, kurum güvenliğinin en pratik ve ölçülebilir alışkanlıklarından biri haline gelir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="zafiyet-analizi" /><category term="nessus" /><category term="openvas" /><category term="siber-guvenlik" /><category term="cvss" /><summary type="html"><![CDATA[Bir ağdaki güvenlik açıklarını elle bulmaya çalışmak, karanlık bir odada LEGO parçası aramaya benzer: mutlaka bir şeye basarsın ama acı biraz geç gelir. Zafiyet analizi, Nessus veya OpenVAS gibi entegre tarayıcılarla sistemlerdeki bilinen güvenlik açıklarının otomatik tespit edilmesi, önceliklendirilmesi ve raporlanması sürecidir. Amaç saldırmak değil; saldırganlardan önce eksikleri görmek, ölçmek ve kapatmaktır.]]></summary></entry><entry><title type="html">Birim Testleri ve Profil Analizi: Koduna Dedektif Gibi Yaklaş</title><link href="https://sonsuzus.github.io/posts/birim-testleri-ve-profil-analizi-koduna-dedektif-gibi-yaklas/" rel="alternate" type="text/html" title="Birim Testleri ve Profil Analizi: Koduna Dedektif Gibi Yaklaş" /><published>2026-07-25T00:00:00+00:00</published><updated>2026-07-25T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/birim-testleri-ve-profil-analizi-koduna-dedektif-gibi-yaklas</id><content type="html" xml:base="https://sonsuzus.github.io/posts/birim-testleri-ve-profil-analizi-koduna-dedektif-gibi-yaklas/"><![CDATA[<p>Kod yazmak bazen Lego yapmak gibidir: Parçalar tek tek güzel görünür ama kuleyi kaldırınca ortadan ikiye ayrılıyorsa bir yerde hata vardır. Birim testleri, bu Lego parçalarının tek başına sağlam olup olmadığını kontrol eder. Profil analizi ise aynı parçaların ne kadar hızlı, ne kadar bellekle ve hangi maliyetle çalıştığını gösterir. Yani biri doğruluk dedektifi, diğeri performans dedektifidir.
``
Birim testinin temel fikri basittir: Büyük bir sistemi küçük davranışlara ayırır, her davranışı izole biçimde sınarız. Bir fonksiyonun beklenen çıktıyı üretip üretmediğini test etmek, yazılımın matematiksel olarak daha güvenilir hale gelmesine yardım eder. Elbette testler mutlak ispat değildir; fakat doğru seçilmiş örnekler, sınır durumları ve hata senaryolarıyla güven düzeyini ciddi biçimde artırır.</p>

<p>Bir fonksiyonu $f(x)$ gibi düşünelim. Test yazarken aslında belirli girdiler için şu önermeyi kontrol ederiz: $f(girdi) = beklenen_çıktı$. Örneğin indirim hesaplayan bir fonksiyonda $f(100, 0.2) = 80$ olmalıdır. Eğer bu önerme bozulursa test kırmızıya döner ve bize şunu söyler: Kodun davranışı ile beklentin aynı evrende yaşamıyor.</p>

<table>
  <thead>
    <tr>
      <th>Kavram</th>
      <th>Ne Kontrol Eder?</th>
      <th>Tipik Soru</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Birim testi</td>
      <td>Doğruluk</td>
      <td>Fonksiyon doğru sonucu veriyor mu?</td>
    </tr>
    <tr>
      <td>Entegrasyon testi</td>
      <td>Parçalar arası uyum</td>
      <td>Modüller birlikte çalışıyor mu?</td>
    </tr>
    <tr>
      <td>Profil analizi</td>
      <td>Performans</td>
      <td>Zaman ve bellek nerede harcanıyor?</td>
    </tr>
    <tr>
      <td>Benchmark</td>
      <td>Karşılaştırmalı hız</td>
      <td>A yöntemi mi B yöntemi mi hızlı?</td>
    </tr>
  </tbody>
</table>

<p>Birim testlerinde yaygın desen Arrange-Act-Assert üçlüsüdür. Önce ortamı hazırlarız, sonra fonksiyonu çalıştırırız, en sonunda sonucu doğrularız. Python ve pytest ile küçük ama anlamlı bir örnek görelim:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">calculate_discount</span><span class="p">(</span><span class="n">price</span><span class="p">,</span> <span class="n">rate</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">price</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
        <span class="k">raise</span> <span class="nc">ValueError</span><span class="p">(</span><span class="sh">'</span><span class="s">price cannot be negative</span><span class="sh">'</span><span class="p">)</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="mi">0</span> <span class="o">&lt;=</span> <span class="n">rate</span> <span class="o">&lt;=</span> <span class="mi">1</span><span class="p">:</span>
        <span class="k">raise</span> <span class="nc">ValueError</span><span class="p">(</span><span class="sh">'</span><span class="s">rate must be between 0 and 1</span><span class="sh">'</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">price</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">rate</span><span class="p">)</span>


<span class="k">def</span> <span class="nf">test_calculate_discount_normal_case</span><span class="p">():</span>
    <span class="c1"># Arrange
</span>    <span class="n">price</span> <span class="o">=</span> <span class="mi">100</span>
    <span class="n">rate</span> <span class="o">=</span> <span class="mf">0.25</span>

    <span class="c1"># Act
</span>    <span class="n">result</span> <span class="o">=</span> <span class="nf">calculate_discount</span><span class="p">(</span><span class="n">price</span><span class="p">,</span> <span class="n">rate</span><span class="p">)</span>

    <span class="c1"># Assert
</span>    <span class="k">assert</span> <span class="n">result</span> <span class="o">==</span> <span class="mi">75</span>


<span class="k">def</span> <span class="nf">test_calculate_discount_rejects_negative_price</span><span class="p">():</span>
    <span class="kn">import</span> <span class="n">pytest</span>
    <span class="k">with</span> <span class="n">pytest</span><span class="p">.</span><span class="nf">raises</span><span class="p">(</span><span class="nb">ValueError</span><span class="p">):</span>
        <span class="nf">calculate_discount</span><span class="p">(</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span> <span class="mf">0.2</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu testler sadece normal senaryoyu değil, hata senaryosunu da kontrol eder. İyi test yazmanın püf noktası, mutlu yol kadar mutsuz yolları da düşünmektir. Çünkü kullanıcılar her zaman bizim hayal ettiğimiz gibi davranmaz; bazen eksi fiyat girerler, bazen yüzde 400 indirim isterler, bazen de sistemin sabrını sınarlar.</p>

<p>Test kapsamı konuşulurken sıkça coverage oranı gündeme gelir. Diyelim ki projenizde 100 satır çalıştırılabilir kod var ve testler 85 satırı çalıştırıyor. Kapsam yaklaşık $Coverage = \frac{85}{100} \times 100 = 85\%$ olur. Ancak dikkat: Yüksek coverage, kaliteli test anlamına her zaman gelmez. Bir satırı çalıştırmak başka, onun doğru davrandığını doğrulamak başkadır.</p>

<table>
  <thead>
    <tr>
      <th>İyi Test</th>
      <th>Kötü Test</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tek davranışı sınar</td>
      <td>Her şeyi aynı anda test eder</td>
    </tr>
    <tr>
      <td>Okunabilir isim taşır</td>
      <td>test1, test2 gibi belirsizdir</td>
    </tr>
    <tr>
      <td>Sınır durumlarını içerir</td>
      <td>Sadece kolay örnekleri dener</td>
    </tr>
    <tr>
      <td>Deterministiktir</td>
      <td>Bazen geçer bazen kalır</td>
    </tr>
  </tbody>
</table>

<p>Gelelim profil analizine. Kod doğru olabilir ama yavaşsa kullanıcı yine mutsuz olur. Python’da cProfile, hangi fonksiyonun kaç kez çağrıldığını ve toplamda ne kadar süre harcadığını gösterir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">cProfile</span>

<span class="k">def</span> <span class="nf">slow_sum</span><span class="p">(</span><span class="n">numbers</span><span class="p">):</span>
    <span class="n">total</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="k">for</span> <span class="n">number</span> <span class="ow">in</span> <span class="n">numbers</span><span class="p">:</span>
        <span class="n">total</span> <span class="o">+=</span> <span class="n">number</span>
    <span class="k">return</span> <span class="n">total</span>

<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="sh">'</span><span class="s">__main__</span><span class="sh">'</span><span class="p">:</span>
    <span class="n">data</span> <span class="o">=</span> <span class="nf">range</span><span class="p">(</span><span class="mi">10_000_000</span><span class="p">)</span>
    <span class="n">cProfile</span><span class="p">.</span><span class="nf">run</span><span class="p">(</span><span class="sh">'</span><span class="s">slow_sum(data)</span><span class="sh">'</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu çıktı bize darboğazları gösterir. Performans analizinde önemli olan tahminle değil ölçümle hareket etmektir. Çünkü geliştiricinin iç sesi çoğu zaman dramatiktir: “Kesin şu döngü yavaş!” Profil aracı ise sakin bir şekilde “Hayır dostum, asıl sorun veritabanı çağrısında” diyebilir.</p>

<p>Birim testleri ve profil araçları birlikte kullanıldığında güvenli refactoring mümkün olur. Önce testlerle davranışı sabitlersin, sonra profille yavaş noktaları bulursun, ardından kodu iyileştirirsin. Son adımda testleri tekrar çalıştırırsın. Eğer testler yeşilse ve profil daha iyiyse, kodun hem doğru hem de daha fit hale gelmiştir.</p>

<p>Özetle, test yazmak zaman kaybı değil, gelecekteki panik anlarına yapılan yatırımdır. Profil analizi de optimizasyonu falcılıktan çıkarıp mühendisliğe dönüştürür. Koduna küçük bir laboratuvar kur: testlerle doğrula, profille ölç, sonra gönül rahatlığıyla geliştir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="unit-testing" /><category term="pytest" /><category term="profiling" /><category term="performans" /><category term="yazılım-kalitesi" /><summary type="html"><![CDATA[Kod yazmak bazen Lego yapmak gibidir: Parçalar tek tek güzel görünür ama kuleyi kaldırınca ortadan ikiye ayrılıyorsa bir yerde hata vardır. Birim testleri, bu Lego parçalarının tek başına sağlam olup olmadığını kontrol eder. Profil analizi ise aynı parçaların ne kadar hızlı, ne kadar bellekle ve hangi maliyetle çalıştığını gösterir. Yani biri doğruluk dedektifi, diğeri performans dedektifidir.]]></summary></entry><entry><title type="html">Dosya İşlemleri ve I/O Akışları: Veriyi Diskle Dans Ettirmek</title><link href="https://sonsuzus.github.io/posts/dosya-islemleri-ve-io-akislari-veriyi-diskle-dans-ettirmek/" rel="alternate" type="text/html" title="Dosya İşlemleri ve I/O Akışları: Veriyi Diskle Dans Ettirmek" /><published>2026-07-25T00:00:00+00:00</published><updated>2026-07-25T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/dosya-islemleri-ve-io-akislari-veriyi-diskle-dans-ettirmek</id><content type="html" xml:base="https://sonsuzus.github.io/posts/dosya-islemleri-ve-io-akislari-veriyi-diskle-dans-ettirmek/"><![CDATA[<p>Bir programın dış dünyayla konuşmasının en eski ama en vazgeçilmez yolu dosyalardır. Günlük tutan bir uygulama, JSON ayarı okuyan bir oyun, CSV raporu üreten bir analiz aracı ya da büyük veri parçasını satır satır işleyen bir servis… Hepsi aslında aynı soruyu sorar: Veriyi güvenli, hızlı ve anlaşılır biçimde nasıl okur/yazarım?
``
Dosya işlemlerini sadece open-read-write-close ezberi gibi görmek büyük haksızlık olur. Arka planda işletim sistemi, disk, bellek, tamponlar ve akışlar arasında minik bir lojistik şirketi çalışır. Programımız dosyanın tamamını çoğu zaman doğrudan diske gidip almaz; işletim sistemi veriyi parça parça getirir, tamponlar, gerektiğinde diske yazar. Bu yüzden I/O yani Input/Output işlemlerinde performansın anahtarı, veriyi doğru boyutta ve doğru biçimde taşımaktır.</p>

<p>Temel kavram akıştır. Akış, verinin bir kaynaktan hedefe sıralı şekilde aktığı soyut kanaldır. Dosya, terminal, ağ soketi veya bellek tamponu birer akış gibi düşünülebilir. Matematiksel olarak okuma maliyetini basitçe şöyle düşünebiliriz: $T = \frac{B}{R} + L$. Burada $B$ taşınan bayt sayısı, $R$ aktarım hızı, $L$ ise gecikmedir. Küçük küçük binlerce okuma yapmak $L$ değerini tekrar tekrar ödetir; parçalı ama dengeli okumak genelde daha verimlidir.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Ne zaman kullanılır?</th>
      <th>Avantaj</th>
      <th>Risk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tüm dosyayı okumak</td>
      <td>Küçük metinler, ayar dosyaları</td>
      <td>Basit kod</td>
      <td>Büyük dosyada bellek şişer</td>
    </tr>
    <tr>
      <td>Satır satır okumak</td>
      <td>Log, CSV, rapor</td>
      <td>Bellek dostu</td>
      <td>Rastgele erişim zayıf</td>
    </tr>
    <tr>
      <td>Parça parça okumak</td>
      <td>Büyük ikili dosya</td>
      <td>Performans kontrolü</td>
      <td>Kod biraz uzar</td>
    </tr>
    <tr>
      <td>Yapılandırılmış okuma</td>
      <td>JSON, YAML, CSV</td>
      <td>Anlamlı veri modeli</td>
      <td>Hatalı format patlatabilir</td>
    </tr>
  </tbody>
</table>

<p>Metin dosyalarında kodlama konusu da kritik. UTF-8 bugün varsayılan kahramanımızdır; Türkçe karakterlerin bozulmaması için dosya açarken kodlamayı açıkça belirtmek iyi alışkanlıktır. İkili dosyalarda ise karakter değil bayt okuruz; resim, ses veya sıkıştırılmış dosyalar bu kategoriye girer.</p>

<p>Aşağıdaki örnek, bir JSON ayar dosyasını okumayı; dosya yoksa varsayılan içerikle oluşturmayı gösterir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">pathlib</span> <span class="kn">import</span> <span class="n">Path</span>
<span class="kn">import</span> <span class="n">json</span>

<span class="n">path</span> <span class="o">=</span> <span class="nc">Path</span><span class="p">(</span><span class="sh">'</span><span class="s">ayarlar.json</span><span class="sh">'</span><span class="p">)</span>

<span class="k">try</span><span class="p">:</span>
    <span class="k">with</span> <span class="n">path</span><span class="p">.</span><span class="nf">open</span><span class="p">(</span><span class="sh">'</span><span class="s">r</span><span class="sh">'</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="sh">'</span><span class="s">utf-8</span><span class="sh">'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
        <span class="n">config</span> <span class="o">=</span> <span class="n">json</span><span class="p">.</span><span class="nf">load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
<span class="k">except</span> <span class="nb">FileNotFoundError</span><span class="p">:</span>
    <span class="n">config</span> <span class="o">=</span> <span class="p">{</span><span class="sh">'</span><span class="s">tema</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">dark</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">sayfa_boyutu</span><span class="sh">'</span><span class="p">:</span> <span class="mi">20</span><span class="p">}</span>
    <span class="k">with</span> <span class="n">path</span><span class="p">.</span><span class="nf">open</span><span class="p">(</span><span class="sh">'</span><span class="s">w</span><span class="sh">'</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="sh">'</span><span class="s">utf-8</span><span class="sh">'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
        <span class="n">json</span><span class="p">.</span><span class="nf">dump</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">ensure_ascii</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="n">config</span><span class="p">[</span><span class="sh">'</span><span class="s">tema</span><span class="sh">'</span><span class="p">])</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">with</code> bloğu çok önemlidir. Dosyayı açar, iş bitince otomatik kapatır. Eğer istisna oluşursa bile kaynak sızıntısı yaşanmaz. Bu fikir genelde RAII veya context management mantığıyla açıklanır: Kaynağı kim aldıysa, düzenli biçimde geri bırakmalıdır.</p>

<p>Yazma işlemlerinde bir başka hassas konu atomikliktir. Program dosyayı yazarken çökerse yarım kalmış, bozuk bir dosya bırakabilir. Daha güvenli yaklaşım önce geçici dosyaya yazmak, sonra hedef dosyayla atomik olarak değiştirmektir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">pathlib</span> <span class="kn">import</span> <span class="n">Path</span>
<span class="kn">import</span> <span class="n">os</span><span class="p">,</span> <span class="n">tempfile</span>

<span class="k">def</span> <span class="nf">guvenli_yaz</span><span class="p">(</span><span class="n">hedef</span><span class="p">:</span> <span class="n">Path</span><span class="p">,</span> <span class="n">veri</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
    <span class="n">klasor</span> <span class="o">=</span> <span class="n">hedef</span><span class="p">.</span><span class="n">parent</span>
    <span class="k">with</span> <span class="n">tempfile</span><span class="p">.</span><span class="nc">NamedTemporaryFile</span><span class="p">(</span><span class="sh">'</span><span class="s">w</span><span class="sh">'</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="sh">'</span><span class="s">utf-8</span><span class="sh">'</span><span class="p">,</span> <span class="nb">dir</span><span class="o">=</span><span class="n">klasor</span><span class="p">,</span> <span class="n">delete</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span> <span class="k">as</span> <span class="n">tmp</span><span class="p">:</span>
        <span class="n">tmp</span><span class="p">.</span><span class="nf">write</span><span class="p">(</span><span class="n">veri</span><span class="p">)</span>
        <span class="n">tmp</span><span class="p">.</span><span class="nf">flush</span><span class="p">()</span>
        <span class="n">os</span><span class="p">.</span><span class="nf">fsync</span><span class="p">(</span><span class="n">tmp</span><span class="p">.</span><span class="nf">fileno</span><span class="p">())</span>
        <span class="n">gecici_ad</span> <span class="o">=</span> <span class="n">tmp</span><span class="p">.</span><span class="n">name</span>
    <span class="n">os</span><span class="p">.</span><span class="nf">replace</span><span class="p">(</span><span class="n">gecici_ad</span><span class="p">,</span> <span class="n">hedef</span><span class="p">)</span>

<span class="nf">guvenli_yaz</span><span class="p">(</span><span class="nc">Path</span><span class="p">(</span><span class="sh">'</span><span class="s">rapor.txt</span><span class="sh">'</span><span class="p">),</span> <span class="sh">'</span><span class="s">Merhaba dosya sistemi!</span><span class="sh">'</span><span class="p">)</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">flush()</code> veriyi kullanıcı alanı tamponundan işletim sistemine iter; <code class="language-plaintext highlighter-rouge">fsync()</code> ise diske yazılmasını daha güçlü biçimde talep eder. Her zaman gerekli değildir, çünkü pahalıdır; ama para transferi, kritik ayar veya işlem günlüğü gibi durumlarda değerlidir.</p>

<table>
  <thead>
    <tr>
      <th>İşlem</th>
      <th>Kullanım</th>
      <th>Performans notu</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">read()</code></td>
      <td>Tam içerik</td>
      <td>Küçük dosyada ideal</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">readline()</code></td>
      <td>Tek satır</td>
      <td>Etkileşimli akışlarda kullanışlı</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">for line in f</code></td>
      <td>Satır satır</td>
      <td>Log işlemede favori</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">write()</code></td>
      <td>Metin/bayt yazma</td>
      <td>Tamponlanır</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">fsync()</code></td>
      <td>Diske zorlama</td>
      <td>Güvenli ama yavaş</td>
    </tr>
  </tbody>
</table>

<p>Son olarak, dosya yolu güvenliğini unutmayın. Kullanıcıdan gelen dosya adını doğrudan birleştirmek path traversal gibi sorunlara yol açabilir. Ayrıca eşzamanlı çalışan programlarda kilitleme, izinler ve yarış koşulları düşünülmelidir. Kısacası dosya I/O, basit bir kapı kolu gibi görünür; ama arkasında bellek yönetimi, işletim sistemi çağrıları ve veri bütünlüğüyle dolu koca bir makine odası vardır. Doğru akış modelini seçerseniz, veriniz de programınız da huzurla yaşar.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="dosya-islemleri" /><category term="io-akislari" /><category term="programlama" /><summary type="html"><![CDATA[Bir programın dış dünyayla konuşmasının en eski ama en vazgeçilmez yolu dosyalardır. Günlük tutan bir uygulama, JSON ayarı okuyan bir oyun, CSV raporu üreten bir analiz aracı ya da büyük veri parçasını satır satır işleyen bir servis… Hepsi aslında aynı soruyu sorar: Veriyi güvenli, hızlı ve anlaşılır biçimde nasıl okur/yazarım?]]></summary></entry></feed>