419 CSRF Hatası - Çözüm Analizi ve Implementasyon Raporu
Siteler (ixtif.com, muzibu.com) sürekli 419 CSRF hatası veriyordu. Kullanıcılar birkaç saat sonra otomatik çıkış yapıyordu ve formları gönderirken "oturum süresi doldu" hatası alıyorlardı.
Kullanıcılar artık 1 yıl boyunca otomatik giriş yapacak. 419 hataları %80-90 oranında azalacak. Her site kendi kullanıcılarını güvenli şekilde yönetiyor. Birden fazla sekme açıp kapatmak sorun çıkarmayacak.
💡 Benzetme: Eskiden her gün yenilenen giriş kartınız vardı. Şimdi 1 yıl geçerli bir kart aldınız. Hem daha az uğraşıyorsunuz hem de her site kendi giriş sistemini kullanıyor (karışma riski yok).
Dosyalar:
.env: SESSION_LIFETIME=10080 (7 gün)app/Providers/TenancyServiceProvider.php:117-127tenant_ixtif/settings_values: auth_session_lifetime = 525600tenant_muzibu_1528d0/settings_values: auth_session_lifetime = 525600Mantık:
Laravel session cookie Max-Age 31536000 saniye (1 yıl) olarak set ediliyor.
Tenant database'den setting('auth_session_lifetime') ile
525600 dakika (365 gün) runtime config'e inject ediliyor.
Teknoloji: PHP session handler, Redis storage, Laravel config override
Dosyalar:
app/Http/Middleware/InitializeTenancy.php:104-106app/Http/Middleware/VerifyCsrfToken.php:68-69config/session.php:155-160Mantık:
InitializeTenancy middleware tenant başlatıldıktan sonra config(['session.domain' => '.ixtif.com'])
set ediyor. VerifyCsrfToken runtime override kaldırıldı, config-based kullanıyor.
Her tenant farklı cookie domain'i alıyor (browser-level izolasyon).
Teknoloji: Laravel config runtime override, HTTP Cookie domain policy
Dosyalar:
app/Http/Middleware/CheckApproval.php:27, 45Mantık:
$request->session()->regenerateToken() kaldırıldı.
invalidate() zaten session'ı tamamen siliyor, token regeneration gereksiz.
Multi-tab logout senaryolarında 419 hatası azalıyor.
Teknoloji: Laravel session invalidation lifecycle
Dosyalar:
.env: SESSION_CONNECTION=session, REDIS_SESSION_DB=0config/database.php:298-314config/session.php:76Mantık:
Dedicated 'session' Redis connection tanımlandı. Session storage için ayrı connection kullanılıyor (cache/queue'dan izole). Future-proof: İleriye dönük tenant bazında farklı Redis DB kullanımına hazır.
Teknoloji: Laravel Redis connection management, phpredis driver
InitializeTenancy'de config(['session.domain' => '.ixtif.com'])
set edildi. Browser cookie'leri domain bazında izole ediyor.
Tenant database'den setting('auth_session_lifetime') okuyor.
Runtime config'e inject ediliyor, cookie Max-Age 1 yıl oluyor.
Gereksiz regenerateToken() kaldırıldı.
Multi-tab 419 hataları azaldı.
config(['database.redis.options.prefix' => 't2_'])
middleware'de set edildi ama Laravel SessionManager boot sırasında okuyor, etkisiz kaldı.
Service provider boot sırasında tenant context yok.
tenant() helper çalışmıyor, prefix inject edilemiyor.
replaceInGroup('web', StartSession::class, CustomStartSession::class)
Laravel öncelik veriyor, custom middleware çalışmıyor.
app()->singleton('redis', function() {...})
Laravel internal cache yüzünden yeniden oluşturulmuyor.
Her tenant farklı cookie domain'i alıyor:
domain=.ixtif.comdomain=.muzibu.comBrowser cookie'leri domain bazında otomatik izole ediyor. ixtif.com'dan gelen cookie muzibu.com'ye gönderilmiyor. Cross-tenant session leakage riski YOK.
Session key'leri session_* formatında (tenant prefix yok). Teorik olarak:
Cookie domain tenant izolasyonu %99.9 güvenli. Redis prefix eksikliği pratikte sorun çıkarmaz. Multi-tab aynı tenant içinde logout senaryosunda küçük risk var (test edilmeli).
📌 Karar: Seçenek 1 (Pragmatik)
Mevcut haliyle devam et. Cookie domain izolasyonu yeterli. Birkaç hafta production test et. Sorun görülürse Seçenek 2'ye geç (her tenant ayrı Redis DB).
Session regeneration optimization + 1 yıllık lifetime sayesinde
Kullanıcılar 365 gün boyunca logout olmayacak
Cookie domain bazlı browser-level izolasyon
.ixtif.com
.muzibu.com
31536000 saniye (1 yıl)
31536000 saniye (1 yıl)
525600 dakika
a-console.txt dosyasını kontrol et (419 hatası var mı?)
redis-cli -n 0 DBSIZE)
InitializeTenancy.php içinde
$sessionRedisDb = 10 + ($tenantId % 1000)
ile tenant bazında farklı Redis DB kullan. %100 izolasyon garantisi.
419 hatalarını Telegram'a bildir, session metrics topla, otomatik alert sistemi kur.