HG PHP GüvenliğiEl Kitabı
Bölümler 37 / 38

İçindekiler/Operasyon, Tespit ve Vaka

Bölüm 37

Symfony Güvenliği

15 dk okuma2.959 kelimePHP 8.1+
Ön koşul

Bölüm 6 (SQLi/Doctrine), Bölüm 7 (XSS/Twig), Bölüm 12/14 (auth/Voter), Bölüm 17 (CSRF), Bölüm 24 (imzalı URI), Bölüm 25/26 (sırlar, debug). İleri referans: Bölüm 34 (RCE sonrası).

Bu bölümün kazanımı

Symfony'nin güvenli varsayılanlarını (Twig otomatik kaçış, Security bileşeni/Voter, CSRF, secrets vault) ve framework-özgü en büyük riski — üretimde ifşa olan Profiler/debug mode — öğreneceksiniz. Bu, framework kısmını kapatır.

1. Giriş

Symfony, PHP'nin en olgun ve güvenlik-odaklı framework'lerinden biridir; denetimler, Symfony ile geliştirilen uygulamaların native PHP'ye göre genelde daha az açık içerdiğini gösterir. Symfony güvenliği varsayılan olarak sağlar: Twig şablon motoru çıktıyı otomatik kaçış yapar (Bölüm 7), Doctrine ORM sorguları parametreler (Bölüm 6), Security bileşeni kimlik doğrulama ve Voter'larla yetkilendirme (Bölüm 12, 14) sunar, CSRF token'ları formları korur (Bölüm 17), ve bir secrets vault sırları yönetir (Bölüm 25).

Laravel'de (Bölüm 36) olduğu gibi, Symfony'de de en büyük framework-özgü risk yanlış yapılandırmadır — ve tıpkı Laravel'in Ignition'ında olduğu gibi, bunun başında üretimde ifşa olan debug mode / Profiler gelir. Symfony'nin resmî dokümantasyonu bunu açıkça söyler: "Profiler'ı üretim ortamlarında asla etkinleştirmeyin; bu, projenizde büyük güvenlik açıklarına yol açacaktır."

Symfony Profiler, geliştirmede paha biçilmez bir araçtır ama üretimde erişilebilir olduğunda bir felakettir: /_profiler uç noktaları veritabanı kimlik bilgilerini, ortam değişkenlerini, APP_SECRET'ı, kaynak kodu, phpinfo()'yu ve istek verilerini (giriş formundaki parolalar dahil) ifşa eder. Güvenlik araştırmacıları, bir Fortune 500 şirketinin alt alanında bile ifşa olmuş bir Symfony Profiler'ında düz-metin Okta admin sırrı buldu — ifşa olmuş bir Profiler'ın tüm şirketi nasıl riske attığının kanıtı.

Bu bölüm, Symfony'yi güvenli kullanmayı ele alır ve framework kısmını (WordPress, Laravel, Symfony) kapatır. Ortak tema nettir: framework'ler güçlü varsayılanlar sunar; asıl risk, onları atlamak ve üretimde debug/profiler'ı açık bırakmaktır.


2. Temel Teori

Symfony'nin güvenli varsayılanları — ve onları bozan kullanımlar:

Alan Güvenli varsayılan Onu bozan (tehlike)
XSS (Bölüm 7) Twig {{ }} otomatik kaçış {{ x\|raw }} (kaçışsız)
SQL (Bölüm 6) Doctrine parametreler Ham DQL/SQL string birleştirme
Yetki (Bölüm 14) Security bileşeni + Voter access_control/Voter eksikliği
CSRF (Bölüm 17) Form CSRF token Token'ı devre dışı bırakma
Sırlar (Bölüm 25) Secrets vault .env/APP_SECRET sızıntısı
Debug (Bölüm 26) APP_DEBUG=0 (üretimde) Profiler/debug üretimde açık

Merkezî risk — Profiler/debug üretimde. Symfony'nin APP_DEBUG ve Profiler'ı geliştirmede güçlüdür ama üretimde ifşa olduğunda ciddi bir açıktır. İfşa olmuş bir Profiler'ın verdikleri (araştırmacıların belgelediği): - Kimlik bilgileri: /_profiler üzerinden veritabanı yapılandırması (host, port, kullanıcı adı, parola), APP_SECRET, ortam değişkenleri. - Kaynak kod: /_profiler/open?file=...&line=... ile proje dosyalarının içeriği okunabilir. - phpinfo(): /_profiler/phpinfo üzerinden ortam/yapılandırma ifşası. - İstek verileri: /_profiler/.../search ile geçmiş istekler; bir giriş (login) POST isteğini bulup gönderilen kullanıcı adı/parolayı okuma. - Rota listesi ve mimari: Uygulamanın haritasını çıkarma.

Yani ifşa olmuş bir Profiler, tek başına bir bilgi ifşası + kimlik bilgisi hırsızlığı zinciridir ve sık sık uygulamanın/sunucunun/DB'nin tümüyle ele geçirilmesine yol açar.

APP_SECRET (Bölüm 24, 25). Symfony'nin APP_SECRET'ı, imzalı URI'ler (_fragment/ESI), CSRF token'ları ve "remember me" çerezleri için kullanılır. Sızarsa (ör. ifşa olmuş Profiler veya commit'li .env), saldırgan bunları forge edebilir (imzalı fragment/URI enjeksiyonu, CSRF token üretimi, kalıcı oturum çerezi). Bu yüzden APP_SECRET gizli tutulmalıdır (secrets vault — Bölüm 25).

Twig, Doctrine, Voter — doğru kullanım: - Twig (Bölüm 7): {{ x }} otomatik kaçış; |raw yalnızca güvenilir/temizlenmiş içerikte. - Doctrine (Bölüm 6): Parametreli sorgular (setParameter); ham DQL/SQL'e girdi birleştirme yok. - Voter/access_control (Bölüm 14): Merkezî ve öznitelik-tabanlı yetkilendirme; her hassas eylemde isGranted.


3. Mimarisel Bakış

 GÜVENLİ VARSAYILANLAR (Symfony):
   Twig {{ }} → otomatik kaçış (Böl.7)
   Doctrine setParameter → parametreli SQL (Böl.6)
   Security + Voter/access_control → yetki (Böl.12/14)
   Form CSRF token (Böl.17) · Secrets vault (Böl.25)

 PROFILER ÜRETİMDE İFŞA (dominant risk):
   Saldırgan → /_profiler erişilebilir (APP_DEBUG=1 / yanlış env)
        ↓  DB kimlik bilgileri · APP_SECRET · env değişkenleri
        ↓  /_profiler/open → kaynak kod   ·   /_profiler/phpinfo
        ↓  /_profiler/.../search → login POST → kullanıcı adı/parola
   → kimlik bilgisi hırsızlığı + kaynak ifşası → uygulama/DB/sunucu devri

 APP_SECRET sızarsa (Böl.24, 25):
   imzalı fragment/URI forge · CSRF token üret · remember-me çerezi forge

 SAVUNMA: APP_ENV=prod + APP_DEBUG=0 · Profiler üretimde KAPALI ·
          APP_SECRET secrets vault (Böl.25) · varsayılanları koru

Kritik gözlem: Symfony güvenli varsayılanlar sunar; framework-özgü en büyük risk, üretimde ifşa olan Profiler/debug'dır (Laravel'in Ignition'ıyla aynı tema).


4. Güvensiz Kod

Güvenli varsayılanları atlayan ve Profiler'ı ifşa eden yapılandırma:

<?php
// ⚠️ GÜVENSİZ Symfony kullanımı

// 1) Ham DQL/SQL (Doctrine'i atlar — SQLi, Bölüm 6)
$q = $em->createQuery("SELECT u FROM App\Entity\User u WHERE u.email = '" . $email . "'");
$conn->executeQuery("SELECT * FROM users WHERE name = '$name'");

// 2) Kaçışsız Twig (XSS — Bölüm 7)
// {{ user_bio|raw }}   ← kullanıcı HTML'i çalışır

// 3) Yetkilendirme yok (Bölüm 14) — hassas eylemde isGranted/Voter yok
public function deleteUser(int $id) { /* erişim kontrolü yok */ }
# ⚠️ GÜVENSİZ yapılandırma (üretim)
# .env
APP_ENV: prod
APP_DEBUG: 1                       # FELAKET: Profiler/ifşa (Bölüm 26)
APP_SECRET: s3cr3t...             # .env commit'li → sızar (Bölüm 25)

# config/packages/web_profiler.yaml (dev ayarı üretime sızmış)
web_profiler:
  toolbar: true                    # Profiler üretimde erişilebilir

5. Açığın Analizi

Ham DQL/SQLSQLi (Bölüm 6). Doctrine varsayılan olarak parametreler; ama DQL/SQL'e string birleştirme bunu atlar ve SQLi'yi geri getirir. setParameter ile parametreli olmalı.

{{ x|raw }}XSS (Bölüm 7). Twig otomatik kaçış yapar; ama |raw filtresi kaçışı devre dışı bırakır. Kullanıcı verisiyle |raw, XSS oluşturur. |raw yalnızca güvenilir/temizlenmiş içerikte kullanılmalı.

Yetkilendirme yokYetki (Bölüm 14). Hassas eylemde isGranted/Voter/access_control yok; yetkisiz kullanıcı çağırabilir. Symfony'nin Security bileşeni bunun için vardır.

APP_DEBUG=1 + Profiler açık (üretim)En kritik. /_profiler erişilebilir hâle gelir ve DB kimlik bilgileri, APP_SECRET, env, kaynak kod, phpinfo(), istek verileri (login parolaları) ifşa olur. Üretimde APP_DEBUG=0 ve Profiler kapalı olmalı.

APP_SECRET commit'li/ifşaSır sızıntısı (Bölüm 25). .env commit'liyse veya Profiler ifşa ediyorsa APP_SECRET sızar; saldırgan imzalı URI/fragment, CSRF token ve remember-me çerezi forge eder (Bölüm 24). Secrets vault'ta tutulmalı.

Kök sorun: güvenli varsayılanlar atlanıyor ve — en kritik — Profiler/debug üretimde ifşa oluyor. Çözüm: varsayılanları koru, debug/profiler'ı kapat, APP_SECRET'ı gizle.


6. Hacker Bakış Açısı

Saldırgan bir Symfony uygulamasını nasıl hedefler?

Profiler'ı yoklar. Keşif aşamasında ilk denediklerinden biri /_profiler, /_profiler/phpinfo, /app_dev.php gibi debug/profiler yollarıdır. Erişilebilirse, jackpot: DB kimlik bilgileri, APP_SECRET, env, kaynak kod.

Profiler'dan kimlik bilgisi toplar. /_profiler/.../search ile geçmiş istekleri listeler; bir login POST isteği (HTTP 302) bulup gönderilen kullanıcı adı/parolayı okur — doğrudan kimlik hırsızlığı. Ayrıca DB config'ten parolayı, phpinfo'dan ortamı toplar.

Kaynak kod okur. /_profiler/open?file=... ile controller/entity kaynağını okuyup başka açıkları (iş mantığı, gizli uç noktalar) haritalar.

APP_SECRET'ı silaha çevirir. Ele geçirdiği APP_SECRET ile imzalı fragment/URI (_fragment) enjekte eder, CSRF token üretir veya remember-me çerezi forge ederek kalıcı oturum kazanır (Bölüm 24, 25).

Varsayılanların atlandığı yerleri arar. Ham DQL/SQL (SQLi), |raw (XSS), eksik isGranted (yetki) noktalarını test eder.

Savunmacı dersi: Saldırgan için Symfony'de en verimli hedef ifşa olmuş Profilerdır — tek bir yanlış yapılandırma, kimlik bilgisi + kaynak + sır ifşası verir. Profiler'ı üretimde kapatmak ve APP_SECRET'ı gizlemek birincil savunmadır.


7. Exploit Mantığı

Bu bölüm çalıştırılabilir exploit içermez. Symfony risklerinin neden bu şekilde ortaya çıktığı kavramsaldır:

  • Güvenli varsayılan, atlanınca kaybolur. Symfony açık sınıflarının çoğunu varsayılan olarak önler; risk, geliştiricinin varsayılanı atlamasıyla (ham DQL, |raw, eksik Voter) geri gelir. Laravel'le (Bölüm 36) aynı desen.
  • Profiler = tek yanlış-yapılandırmayla çoklu ifşa. İfşa olmuş Profiler, tek başına bir bilgi-ifşası + kimlik-hırsızlığı + kaynak-ifşası zinciridir; sık sık tam devre tırmanır. Bu, debug/profiler'ın üretimde neden asla açık olmaması gerektiğini gösterir.
  • APP_SECRET = güven kökü. İmzalı URI, CSRF token ve remember-me çerezi APP_SECRET'a dayanır; sızarsa bu güvenlerin hepsi forge edilebilir (Bölüm 24, 25). Sır sızıntısı, ikincil saldırıları çarpar.
  • Ortak tema (framework'ler). WordPress'te ekosistem, Laravel'de Ignition/debug, Symfony'de Profiler/debug — üçünde de framework güçlü varsayılanlar sunar; risk yanlış yapılandırma ve varsayılanları atlamadan gelir.

Savunmacının çerçevesi: (a) Profiler/debug üretimde kapalı mı, (b) APP_SECRET/.env gizli mi, (c) varsayılanlar korunuyor mu (ham DQL/|raw/eksik Voter yok), (d) framework güncel mi. Savunma dördünü de sağlar.


8. Güvenli Kod

Güvenli varsayılanları koruyan ve doğru yapılandırılmış Symfony:

<?php
// ✅ GÜVENLİ Symfony kullanımı

// 1) Doctrine parametreli (SQLi — Bölüm 6)
$user = $em->createQuery('SELECT u FROM App\Entity\User u WHERE u.email = :email')
    ->setParameter('email', $email)                // parametreli
    ->getOneOrNullResult();
$conn->executeQuery('SELECT * FROM users WHERE name = ?', [$name]);

// 2) Twig otomatik kaçış (XSS — Bölüm 7)
// {{ user_bio }}   ← daima kaçışlı; |raw yalnızca güvenilir/temizlenmiş içerikte

// 3) Yetkilendirme — Voter/isGranted (Bölüm 14)
#[IsGranted('ROLE_ADMIN')]                          // öznitelik-tabanlı
public function deleteUser(int $id, Security $security): Response {
    if (!$security->isGranted('USER_DELETE', $user)) {   // Voter (nesne-düzeyi — Bölüm 15)
        throw $this->createAccessDeniedException();
    }
    // ...
}
# ✅ GÜVENLİ yapılandırma (üretim)
# .env / ortam
APP_ENV: prod
APP_DEBUG: 0                       # KRİTİK: debug/Profiler kapalı (Bölüm 26)
# APP_SECRET: secrets vault'ta (bin/console secrets:set) — .env'de/commit'te DEĞİL (Bölüm 25)

# config/packages/prod/web_profiler.yaml — Profiler üretimde KAPALI
web_profiler:
  toolbar: false
# (framework debug: false)

# config/packages/security.yaml — access_control (Bölüm 14)
security:
  access_control:
    - { path: ^/admin, roles: ROLE_ADMIN }

Öne çıkan modern pratikler: - APP_ENV=prod + APP_DEBUG=0 + Profiler kapalı — en kritik: /_profiler erişilemez; kimlik bilgisi/kaynak/sır ifşası önlenir (Bölüm 26). - APP_SECRET secrets vault'ta (Bölüm 25): .env/commit'te değil; sızarsa forge riskini (Bölüm 24) kaldır. - Varsayılanları koru: Doctrine parametreli (Bölüm 6), Twig {{ }} (|raw dikkatli — Bölüm 7), Voter/isGranted (Bölüm 14, 15), CSRF açık (Bölüm 17). - Framework güncel (Bölüm 30): Bilinen Symfony/bileşen açıklarını yamalı tut; SCA. - .env gitignore'lu + web'de erişilemez (Bölüm 25, 27). - php.ini sertleştirme (Bölüm 26): display_errors=Off (ek katman).


9. Patch Analizi

Neden işe yarar? APP_ENV=prod + APP_DEBUG=0 + Profiler kapatma, Symfony'nin en tehlikeli açığının — ifşa olmuş Profiler — ön koşulunu kaldırır: /_profiler erişilemez olur, dolayısıyla DB kimlik bilgileri, APP_SECRET, kaynak kod ve login verileri ifşa olmaz. APP_SECRET'ı secrets vault'ta tutmak, sızsa bile forge saldırılarını (Bölüm 24) önler. Varsayılanları korumak (Doctrine, Twig, Voter, CSRF), kitabın temel açık sınıflarını (Bölüm 6/7/14/17) Symfony bağlamında önler.

Profiler etkisi:

Durum Sonuç
Profiler üretimde erişilebilir DB kimlik bilgileri + APP_SECRET + kaynak + login parolaları ifşa
Profiler kapalı (APP_DEBUG=0) Uç noktalar erişilemez → ifşa yok

Bu, neden Profiler'ı kapatmanın (Laravel'in APP_DEBUG=false'una paralel) tek başına en yüksek-etkili Symfony savunması olduğunu gösterir.

Framework'ler arası ortak ders (WordPress/Laravel/Symfony): Üç framework de güçlü güvenlik varsayılanları sunar. Risk üç yerden gelir: (1) varsayılanları atlamak (ham SQL, kaçışsız çıktı, eksik yetki), (2) yanlış yapılandırma — özellikle üretimde debug/profiler (Laravel Ignition, Symfony Profiler), (3) ekosistem/bağımlılık (WordPress eklentileri, Bölüm 30). Savunma her üçünde de: varsayılanları koru + debug'ı kapat + bağımlılıkları/ekosistemi yönet.

Performans: APP_DEBUG=0 üretimde zaten daha hızlıdır; güvenli varsayılanların etkisi ihmal edilebilir. Güvenlik kazancı çok büyüktür.


10. Gerçek Hayat Senaryosu

Kurgu — bir kurumsal Symfony uygulaması. Bir dağıtım hatası nedeniyle üretimde APP_DEBUG=1 kalmış ve Profiler erişilebilir. Bir saldırgan /_profiler'ı bulup DB kimlik bilgilerini ve APP_SECRET'ı okuyor; /_profiler/.../search ile bir yöneticinin giriş isteğini bulup parolasını ele geçiriyor; /_profiler/open ile kaynak kodu indirip başka açıkları haritalıyor. APP_SECRET ile remember-me çerezi forge edip kalıcı yönetici erişimi kuruyor. Doğru yapılandırmayla: APP_DEBUG=0 + Profiler kapalı + APP_SECRET secrets vault'ta → hiçbiri mümkün olmazdı. Dersler: (1) Profiler/debug üretimde asla açık kalmamalı (Symfony'nin resmî uyarısı); (2) APP_SECRET gizli tutulmalı (Bölüm 24, 25); (3) dağıtım, doğru üretim yapılandırmasını (Bölüm 33) garanti etmeli.


11. Gerçek Vaka Analizi — Symfony Profiler Üretimde İfşa

Symfony resmî dokümantasyonu, Vaadata, Char49 ve Intigriti güvenlik analizleriyle doğrulanmıştır. Framework yanlış-yapılandırmasının ders kitabı örneğidir.

Özet. Symfony'nin en yaygın ve en yıkıcı framework-özgü açığı, tek bir CVE değil, tekrarlayan bir yanlış yapılandırmadır: Profiler / debug mode'un üretimde erişilebilir bırakılması. Symfony resmî dokümantasyonu bunu kesin bir dille uyarır: "Profiler'ı üretim ortamlarında asla etkinleştirmeyin; bu, projenizde büyük güvenlik açıklarına yol açacaktır." Yeni Symfony sürümleri Profiler'ı varsayılan olarak yalnızca dev ortamında etkinleştirir; ama yanlış APP_ENV/APP_DEBUG yapılandırması veya dev yapılandırmasının üretime sızması, onu açığa çıkarır.

Teknik neden — ifşa zinciri. İfşa olmuş bir Profiler, güvenlik araştırmacılarının (Vaadata, Char49, Intigriti) belgelediği gibi bir dizi güçlü ifşa sunar: - Kimlik bilgileri ve sırlar: /_profiler üzerinden veritabanı yapılandırması (host, port, kullanıcı adı, parola), APP_SECRET, ortam değişkenleri. Char49, bir Fortune 500 şirketinin alt alanında ifşa olmuş bir Profiler'da düz-metin Okta admin sırrı buldu — çalınan bu sır, kimlik kontrollerini atlayıp daha geniş sistemlere erişim sağlayabilirdi. - Kaynak kod: /_profiler/open?file=...&line=... ile proje dosyalarının (ör. bir controller'ın) kaynağı okunabilir. - phpinfo(): /_profiler/phpinfo üzerinden ortam/yapılandırma ifşası. - İstek verileri → kimlik hırsızlığı: /_profiler/empty/search/results ile geçmiş istekler listelenir; bir giriş isteği (HTTP 302, /login) bulunup gönderilen kullanıcı adı ve parola okunabilir. Vaadata, bu yolla bir yöneticinin parolasının (UnMotDePasseSuperCompliqué) ele geçirilebildiğini gösterdi — üretimde yeniden kullanılıyorsa doğrudan yönetici erişimi. - Rota listesi ve mimari: Uygulamanın haritası çıkarılıp başka saldırılar planlanır.

Ayrıca ifşa olan APP_SECRET, Symfony fragment'larını (_fragment/ESI) forge etmeye, CSRF token'larını üretmeye ve remember-me çerezlerini forge etmeye (Bölüm 24) izin verebilir. Yani ifşa olmuş Profiler, "yalnızca bilgi ifşası" değil; kimlik bilgisi hırsızlığı, kaynak ifşası ve APP_SECRET sızıntısıyla sık sık uygulamanın/DB'nin/sunucunun tümüyle ele geçirilmesine tırmanır. Bu, Bölüm 26'nın (display_errors/debug ifşası) ve Bölüm 25'in (sırlar) Symfony'deki en somut örneğidir.

Etki. Kimlik bilgisi + sır + kaynak ifşası; sık sık tam devir. Char49 vakasının gösterdiği gibi, "olgun güvenlik duruşuna sahip" büyük şirketlerde bile bir alt alanda ifşa olmuş bir Profiler yeterlidir.

Çıkarılacak dersler: 1. Profiler/debug üretimde asla açık kalmamalı. APP_ENV=prod + APP_DEBUG=0; Symfony'nin resmî ve kesin uyarısı budur (Bölüm 26). 2. APP_SECRET gizli tutulmalı (Bölüm 24, 25). İmzalı URI/fragment, CSRF ve remember-me'nin güven köküdür; sızarsa forge edilir. Secrets vault kullan. 3. Dağıtım doğru yapılandırmayı garantilemeli (Bölüm 33). dev yapılandırmasının üretime sızmasını önle; ortam ayrımı. 4. Framework varsayılanları güvenlidir; risk yapılandırmadadır. Symfony güvenlidir — yeter ki üretim doğru yapılandırılsın.


12. Detection

Yapılandırma/kod incelemede:

grep -rn 'APP_DEBUG\|APP_ENV' .env*                             # üretimde debug açık mı?
grep -rn 'toolbar: true\|profiler' config/packages/            # Profiler üretimde açık mı?
grep -rn 'APP_SECRET' .env* | grep -v vault                    # secret .env'de/commit'te mi?
grep -rn '|raw' templates/                                     # kaçışsız Twig (XSS)
grep -rnE 'createQuery\(.*\.\s*\$|executeQuery\("[^"]*\$' src/  # ham DQL/SQL (SQLi)
curl -s https://site/_profiler                                  # Profiler erişilebilir mi?

Kontroller: Üretimde APP_DEBUG=0 ve Profiler kapalı mı? /_profiler erişilemez mi? APP_SECRET vault'ta mı? Ham DQL/|raw/eksik Voter var mı?

SCA (Bölüm 30): composer audit ile Symfony/bileşen bilinen açıklarını tespit et.

DAST: /_profiler, /_profiler/phpinfo, /app_dev.php erişilebilirliği; ham SQL/XSS/eksik yetki testleri.

Loglar/SIEM (Bölüm 31): /_profiler* yollarına dış erişim (güçlü keşif/sömürü işareti); phpinfo/kaynak-okuma denemeleri; anormal fragment (_fragment) istekleri. Üretimde /_profiler'a herhangi bir dış istek alarm olmalıdır.


13. Prevention

  • APP_ENV=prod + APP_DEBUG=0 + Profiler kapalı — en kritik: İfşayı önler (Bölüm 26).
  • APP_SECRET secrets vault'ta (Bölüm 25): .env/commit'te değil; forge riskini (Bölüm 24) kaldır.
  • Varsayılanları koru: Doctrine parametreli (Bölüm 6), Twig {{ }} (|raw dikkatli — Bölüm 7), Voter/isGranted/access_control (Bölüm 14), CSRF açık (Bölüm 17).
  • Framework güncel (Bölüm 30): SCA + yama.
  • .env gitignore'lu + web'de erişilemez (Bölüm 25, 27).
  • Dağıtımda ortam ayrımı (Bölüm 33): dev yapılandırması üretime sızmasın.
  • php.ini sertleştirme (Bölüm 26): display_errors=Off.

14. Mitigation

  • Acil: APP_ENV=prod + APP_DEBUG=0 yap; Profiler'ı üretimde kapat; /_profiler erişimini engelle; ifşa olduysa DB parolasını ve APP_SECRET'ı döndür (ve remember-me/CSRF'i geçersiz kıl).
  • Geçici: Profiler'dan sızmış kimlik bilgileriyle yapılmış erişimleri incele; sızmış sırları döndür (Bölüm 25); kaynak ifşasından öğrenilmiş başka açıkları kapat.
  • Kalıcı: Üretim yapılandırmasını (APP_DEBUG=0, Profiler kapalı) dağıtım baseline'ına (Bölüm 33) al; APP_SECRET'ı secrets vault'a taşı; SCA + güvenli varsayılanları kod incelemesinde zorunlu kıl.

15. Checklist

  • [ ] Üretimde APP_ENV=prod ve APP_DEBUG=0 mu?
  • [ ] Profiler/web debug toolbar üretimde kapalı ve /_profiler erişilemez mi (Bölüm 26)?
  • [ ] APP_SECRET secrets vault'ta mı (.env/commit'te değil — Bölüm 24, 25)?
  • [ ] Doctrine sorguları parametreli mi (setParameter/? — Bölüm 6)?
  • [ ] Twig çıktısı {{ }} ile kaçışlı mı (|raw yalnızca güvenilir içerikte — Bölüm 7)?
  • [ ] Yetkilendirme Voter/isGranted/access_control ile mi (Bölüm 14, 15)?
  • [ ] CSRF token'ları açık mı (Bölüm 17)?
  • [ ] Symfony ve bileşenler güncel mi (SCA — Bölüm 30)?
  • [ ] .env gitignore'lu ve web'de erişilemez mi (Bölüm 25, 27)?
  • [ ] Dağıtım dev yapılandırmasının üretime sızmasını önlüyor mu (Bölüm 33)?

16. Laboratuvar

Lab 37.1 — Profiler ifşası. İzole bir Symfony'de APP_DEBUG'ı 1/0 arasında değiştir; /_profiler, /_profiler/phpinfo ve /_profiler/.../search üzerinden ifşayı (DB config, login verisi) gözlemle. 0'a alıp kapat.

Lab 37.2 — APP_SECRET. APP_SECRET.env'den secrets vault'a taşı; sızmış bir APP_SECRET'ın neden remember-me/fragment forge'una (Bölüm 24) yol açtığını yaz.

Lab 37.3 — Varsayılanı atlama. Ham DQL ve |raw ile SQLi/XSS'i göster; setParameter ve {{ }} ile düzelt (Bölüm 6, 7).

Lab 37.4 — Voter. Yetkilendirmesiz bir eyleme bir Voter (isGranted) ekle; nesne-düzeyi (Bölüm 15) ve öznitelik-tabanlı yetkilendirmeyi uygula.


17. Quiz

  1. Symfony'nin dört güvenli varsayılanını ve onları bozan kullanımları eşleştirin.
  2. Symfony'nin en yaygın framework-özgü açığı nedir ve resmî doküman ne der?
  3. İfşa olmuş bir Profiler hangi bilgileri (en az dört) sızdırır?
  4. /_profiler/.../search ile kimlik hırsızlığı nasıl yapılır?
  5. APP_SECRET ne için kullanılır ve sızarsa hangi forge saldırıları mümkün olur (Bölüm 24)?
  6. {{ }} ile {{ x|raw }} arasındaki fark nedir (Bölüm 7)?
  7. Doctrine'de SQLi nasıl önlenir (Bölüm 6)?
  8. Voter/isGranted yetkilendirmede ne sağlar (Bölüm 14, 15)?
  9. Profiler'ı kapatmak neden tek başına en yüksek-etkili Symfony savunmasıdır?
  10. WordPress/Laravel/Symfony'nin ortak "framework riski" teması nedir?
  11. dev yapılandırmasının üretime sızması neden tehlikelidir (Bölüm 33)?
  12. Profiler'a üretimde dış erişim neden bir SIEM alarmı olmalıdır?

18. Kaynakça

  • Symfony dokümantasyonu, Security, Profiler ("Never enable the profiler in production"), Twig, Doctrine, Secrets Management (APP_SECRET), CSRF.
  • Vaadata, Symfony Security Best Practices, Vulnerabilities and Attacks; Char49, Misconfiguration in a bottle: Symfony Profiler exposed; Intigriti, Symfony Profiler Enabled; Synacktiv, Looting Symfony with EOS.
  • MITRE, CWE-215 (Information Exposure Through Debug — Bölüm 26), CWE-200 (Information Exposure), CWE-89 (SQLi), CWE-79 (XSS), CWE-522 (sırlar — Bölüm 25).
  • OWASP, Top 10:2021 A05 Security Misconfiguration.
  • Symfony access_control, Voter ve bin/console secrets:* dokümantasyonu.