PHP ile Güvenli Dosya Yükleme İşlemleri

PHP'de dosya yükleme işlemi $_FILES süper küreseli ile yönetilir. Ancak dosyayı sunucuya kabul etmeden önce güvenlik denetimlerinden geçirmek, sitenizin sağlığı için en kritik adımdır.

Dosya Yükleme Formunun Gereksinimleri

Bir HTML formunun dosya gönderebilmesi için iki şart vardır:

  • method="POST" olmalıdır.
  • enctype="multipart/form-data" özelliği mutlaka eklenmelidir.

Kod Örneği: Kontrollü Dosya Yükleme

PHP Secure File Upload Example
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $klasor = "yuklemeler/";
    $dosya  = $klasor . basename($_FILES["dosya"]["name"]);
    $uzanti = strtolower(pathinfo($dosya, PATHINFO_EXTENSION));

    // 1. Dosya Türü Kontrolü (Sadece Resimlere İzin Ver)
    $izin_verilenler = ["jpg", "png", "jpeg", "gif"];
    
    if (!in_array($uzanti, $izin_verilenler)) {
        echo "Hata: Sadece resim dosyalarına izin verilir!";
    } 
    // 2. Boyut Kontrolü (Max 2MB)
    elseif ($_FILES["dosya"]["size"] > 2000000) {
        echo "Hata: Dosya boyutu 2MB'dan büyük olamaz!";
    } 
    // 3. Dosyayı Taşıma
    else {
        if (move_uploaded_file($_FILES["dosya"]["tmp_name"], $dosya)) {
            echo "Dosya başarıyla yüklendi: " . htmlspecialchars(basename($_FILES["dosya"]["name"]));
        } else {
            echo "Dosya yüklenirken bir hata oluştu.";
        }
    }
}
?>

<!-- HTML Form -->
<form action="" method="post" enctype="multipart/form-data" class="mt-3">
    <input type="file" name="dosya" class="form-control mb-2">
    <button type="submit" class="btn btn-primary">Yükle</button>
</form>
🛡️ Güvenlik İpucu: Kullanıcının gönderdiği dosya adını direkt kullanmak yerine, uniqid() gibi fonksiyonlarla dosyayı yeniden isimlendirmek, üzerine yazma hatalarını ve kötü niyetli saldırıları engeller.

$_FILES Dizisi Parametreleri

Dosya yüklendiğinde PHP şu bilgileri bize sunar:

  • $_FILES["dosya"]["name"]: Dosyanın orijinal adı.
  • $_FILES["dosya"]["tmp_name"]: Dosyanın sunucudaki geçici kopyası.
  • $_FILES["dosya"]["size"]: Dosyanın bayt (byte) cinsinden boyutu.
  • $_FILES["dosya"]["error"]: Varsa yükleme hatası kodu.