Gereksinimler ve Ön Hazırlık
Güvenli bir dosya yükleme paneli geliştirmek için güncel bir geliştirme ortamına ihtiyacınız vardır. PHP 8.2 veya üzeri sürümler, modern güvenlik standartlarını desteklediği için şiddetle tavsiye edilir. İşletim sisteminizde Apache veya Nginx web sunucusu kurulu olmalı ve php.ini dosyasındaki file_uploads yönergesinin On konumunda olduğundan emin olmalısınız.
- PHP 8.2+ sürümü
- Yazma izni tanımlanmış bir yükleme dizini (örneğin:
/uploads) - Dosya yükleme işlemleri için
$_FILESsüper global değişkenine erişim - Dosya isimlendirmeleri için benzersiz ID (UUID) oluşturma kütüphanesi veya
bin2hex(random_bytes())fonksiyonu
Adım 1: HTML Formunun Hazırlanması
Dosya yükleme işleminin ilk adımı, kullanıcının dosya seçebileceği bir HTML formu oluşturmaktır. Burada en kritik nokta, form etiketine enctype="multipart/form-data" niteliğini eklemektir. Aksi takdirde, dosya verileri sunucuya iletilmeyecektir.
Dosya Seçin:
Yükle
Bu form, kullanıcının seçtiği dosyayı upload.php dosyasına POST metodu ile gönderir. required niteliği, tarayıcı tarafında boş gönderimi engellemek için eklenmiştir.
Adım 2: Sunucu Tarafı Güvenlik Kontrolleri
Dosya sunucuya ulaştığında, onu doğrudan olduğu gibi kaydetmek büyük bir hatadır. İlk olarak, dosyanın gerçekten bir dosya olup olmadığını ve boyutunun belirlenen sınırları aşıp aşmadığını kontrol etmeliyiz. Aşağıdaki kod bloğu, temel bir güvenlik katmanı oluşturur.
Adım 3: Dosya İsimlendirme ve Rastgeleleştirme
Dosyaları orijinal isimleriyle kaydetmek, "Directory Traversal" (dizin geçişi) saldırılarına ve dosya üzerine yazma (overwrite) risklerine davetiye çıkarır. Kullanıcı "resim.jpg" adında bir dosya yüklediğinde, sunucuda aynı isimde başka bir dosya varsa verileriniz kaybolabilir. Bunu önlemek için bin2hex(random_bytes(16)) fonksiyonu ile benzersiz isimler oluşturmak en güvenli yöntemdir.
$dosya_uzantisi = pathinfo($_FILES["dosya"]["name"], PATHINFO_EXTENSION);
$yeni_isim = bin2hex(random_bytes(16)) . '.' . $dosya_uzantisi;
$hedef_dizin = "uploads/";
$hedef_yol = $hedef_dizin . $yeni_isim;
if (move_uploaded_file($_FILES["dosya"]["tmp_name"], $hedef_yol)) {
echo "Dosya başarıyla yüklendi: " . $yeni_isim;
} else {
echo "Dosya taşınırken bir hata oluştu.";
}
Adım 4: MIME Tipi ve İçerik Doğrulama
Sadece dosya uzantısını kontrol etmek yeterli değildir; çünkü bir saldırgan kötüniyetli.php dosyasının adını resim.jpg olarak değiştirerek sunucunuza yükleyebilir. Dosyanın gerçek içeriğini doğrulamak için PHP'nin finfo sınıfını kullanmalısınız.
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mime_turu = $finfo->file($_FILES["dosya"]["tmp_name"]);
$izin_verilenler = ['image/jpeg', 'image/png', 'image/gif'];
if (!in_array($mime_turu, $izin_verilenler)) {
die("Hata: Sadece JPG, PNG veya GIF dosyaları yüklenebilir.");
}
İleri İpuçları: Dosya Depolama ve Güvenlik Stratejileri
Dosya yükleme panelinizi daha profesyonel ve güvenli hale getirmek için şu stratejileri uygulayabilirsiniz:
- Dizin İzinleri: Yükleme dizininizdeki (uploads/) PHP dosyalarının çalıştırılmasını engellemek için bir
.htaccess dosyası oluşturun.
- Web Kökü Dışında Depolama: Mümkünse dosyaları
public_html veya www dizininin bir üst klasöründe saklayın ve bir PHP betiği üzerinden okutun.
- Dosya Boyutu Sınırı:
php.ini dosyasındaki upload_max_filesize ve post_max_size ayarlarını ihtiyaçlarınıza göre kısıtlayın.
Önemli Not: Yükleme dizininize asla yazma (write) izni dışında çalıştırma (execute) izni vermeyin. Sunucu yapılandırmanızda php_flag engine off komutunu kullanarak dizin içerisindeki scriptlerin çalışmasını tamamen durdurabilirsiniz.
# .htaccess örneği (uploads klasörü içine koyun)
php_flag engine off
RemoveHandler .php .phtml .php3
AddType text/plain .php .phtml .php3


Yorumlar (0)
Yorum Yaz