Plesk'te belge kökü yanlışsa .env dosyanız internetten okunabilir
Laravel kurdunuz, site çalışıyor, her şey yolunda görünüyor. Ama tarayıcıya /.env yazan biri uygulama anahtarınızı indirebiliyor olabilir.
Bu yazı bir vaka anlatısı. Geçen hafta bir Laravel projesini Plesk'e kurarken sırayla dört farklı sorunla karşılaştık ve her biri klasikti. En tehlikelisi de en sessiz olanıydı.
Belge kökü meselesi
Laravel'in dizin yapısı şöyledir:
httpdocs/
├── .env ← uygulama anahtarı, veritabanı parolası
├── app/ ← kaynak kod
├── vendor/ ← bağımlılıklar
├── storage/ ← loglar, önbellek
└── public/ ← YALNIZCA burası dışarıya açık olmalı
└── index.php
Plesk'te bir abonelik açtığınızda belge kökü varsayılan olarak
httpdocs gelir. Laravel'i oraya kurup belge kökünü değiştirmezseniz,
web sunucusu bütün klasörü servis eder.
Sonuç: https://siteniz.com/.env adresi dosyayı indirir.
O dosyada APP_KEY vardır. O anahtar oturum çerezlerini imzalar ve
şifrelenmiş alanları çözer. Veritabanı parolanız da oradadır.
Düzeltmesi
Plesk → Hosting Ayarları → Belge kökü → httpdocs/public
Bu kadar. Ama unutulması da bu kadar kolay, çünkü site belge kökü yanlışken de çalışır. Hiçbir hata vermez. Sadece savunmasızdır.
Doğrulaması
Kurulum sonrası ilk yapılacak kontrol:
curl -s -o /dev/null -w "%{http_code}\n" https://siteniz.com/.env
403 veya 404 bekliyoruz. 200 dönüyorsa belge kökü yanlıştır. Düzeltin
ve ardından php artisan key:generate ile anahtarı yenileyin — eski anahtar
ifşa olmuş sayılır.
Yanındaki üç klasik
Aynı kurulumda karşılaştığımız diğer üç sorun:
1. PHP sürümü. Laravel 12/13 PHP 8.2+ ister. Plesk'te abonelik 8.1'de kalmışsa site 500 verir ve log'a çoğu zaman anlamlı bir şey yazmaz, çünkü hata autoloader'ın ilk satırında oluşur. Plesk → PHP Ayarları'ndan kontrol edin.
2. Dağıtım kancası chroot'ta. Plesk'in Git dağıtım eylemleri, SSH
erişimi "chrooted" seçiliyken hapsedilmiş bir kabukta çalışır. composer
bir yana, /opt/plesk/php/8.3/bin/php bile görünmez — tam yol yazsanız
da "No such file or directory" alırsınız.
İki yolu var: ya SSH erişimini /bin/bash yapıp yalıtımı gevşetirsiniz, ya
da vendor/ klasörünü depoya alıp sunucuda composer'a hiç ihtiyaç
duymazsınız. Müşteri sitelerini de barındıran bir makinede ikinci yolu
tercih ederim.
3. APP_KEY yanlış uzunlukta. Anahtarı elle kopyalarken bir karakter
eksilirse Laravel şu hatayı verir:
Unsupported cipher or incorrect key length
Varsayılan şifre AES-256-CBC'dir ve tam 32 bayt anahtar ister; yani
base64: kısmından sonrası 44 karakter olmalıdır. Kopyalamak yerine
sunucuda üretin:
php artisan key:generate --force
Ve bir de kalıcı ayar
php.ini'de expose_php = Off yapın. Aksi hâlde her yanıtta
X-Powered-By: PHP/8.4.24 başlığı gider ve saldırgana hangi açığı
deneyeceğini siz söylemiş olursunuz.
Kontrol:
curl -sI https://siteniz.com/ | grep -i x-powered-by
Çıktı boşsa doğru.
// paylaş
// hatıra defteri
Sen ne hatırlıyorsun?
Burası yorum alanı değil. Bu yazıyı okurken aklına gelen kendi hatıranı bırak — bir isim, bir akşam, bir ayrıntı. Arşiv ortak hafızayla büyüyor.
Defter henüz boş. İlk hatırayı sen bırak.