Dosya Yükleme (Upload): Tekli ve Çoklu Resim Yükleme Scripti

  • Konbuyu başlatan Konbuyu başlatan irfo
  • Başlangıç tarihi Başlangıç tarihi

irfo

Moderatör
Katılım
7 Ocak 2026
Mesajlar
290
Tepkime puanı
2
Puanları
18
Kullanıcıların sunucunuza dosya göndermesine izin vermek, kapıyı dış dünyaya açmak gibidir. Doğru önlemler alınmazsa saldırganlar zararlı scriptler (.php dosyaları gibi) yükleyerek sitenizi ele geçirebilir. Bu rehberde, 2026 standartlarına uygun, güvenli bir yükleme sistemi kuracağız.

1. Form Hazırlığı (HTML)​


Dosya yüklemek için HTML formunda enctype="multipart/form-data" parametresi mutlaka bulunmalıdır. Aksi takdirde $_FILES dizisi boş dönecektir.

HTML:
<form action="upload.php" method="POST" enctype="multipart/form-data">
<label>Profil Resmi Seçin:</label>
<input type="file" name="dosya">

<label>Galeri İçin Resimler Seçin:</label>
<input type="file" name="resimler[]" multiple>

<button type="submit">Yükle</button>

</form>

2. Güvenli Tekli Dosya Yükleme (PHP)​


Dosya yüklerken sadece uzantıya bakmak (örn: .jpg) güvenli değildir. MIME tipini ve dosya içeriğini kontrol etmek gerekir.

PHP:
<?php
if (_SERVER[&#39;REQUEST_METHOD&#39;] == &#39;POST&#39; &amp;&amp; isset(_FILES['dosya'])) {
$hata_mesajlari = [];
$yukleme_dizini = 'uploads/';
$izin_verilen_tipler = ['image/jpeg', 'image/png', 'image/gif'];
$maks_boyut = 2 * 1024 * 1024; // 2 MB

$dosya = $_FILES[&#39;dosya&#39;];

// 1. Hata Kontrolü
if ($dosya[&#39;error&#39;] !== UPLOAD_ERR_OK) {
    $hata_mesajlari[] = &quot;Yükleme sırasında bir hata oluştu.&quot;;
}

// 2. Boyut Kontrolü
if ($dosya[&#39;size&#39;] &gt; $maks_boyut) {
    $hata_mesajlari[] = &quot;Dosya boyutu 2MB&#39;den büyük olamaz.&quot;;
}

// 3. Tip Kontrolü (finfo kullanımı en güvenlisidir)
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mime_tipi = $finfo-&gt;file($dosya[&#39;tmp_name&#39;]);
if (!in_array($mime_tipi, $izin_verilen_tipler)) {
    $hata_mesajlari[] = &quot;Sadece JPG, PNG ve GIF yükleyebilirsiniz.&quot;;
}

// 4. Güvenli İsimlendirme ve Taşıma
if (empty($hata_mesajlari)) {
    $uzanti = pathinfo($dosya[&#39;name&#39;], PATHINFO_EXTENSION);
    $yeni_isim = bin2hex(random_bytes(10)) . &#39;.&#39; . $uzanti;
    $hedef = $yukleme_dizini . $yeni_isim;

    if (move_uploaded_file($dosya[&#39;tmp_name&#39;], $hedef)) {
        echo &quot;Dosya başarıyla yüklendi: &quot; . $yeni_isim;
    } else {
        echo &quot;Dosya taşıma hatası.&quot;;
    }
} else {
    foreach ($hata_mesajlari as $hata) echo $hata . &quot;<br>&quot;;
}

}
?>

3. Çoklu Resim Yükleme (Array Handling)​


Birden fazla dosya gönderildiğinde $_FILES dizisinin yapısı biraz karmaşıklaşır. Bu yapıyı bir döngü ile çözmemiz gerekir.

PHP:
if (isset($_FILES['resimler'])) {
dosyasayisi=count(_FILES['resimler']['name']);

for ($i = 0; $i < $dosya_sayisi; $i++) {
    $gecici_yol = $_FILES['resimler']['tmp_name'][$i];
    $dosya_adi = $_FILES['resimler']['name'][$i];
    
    if ($gecici_yol != "") {
        $hedef = "uploads/" . time() . "_" . $dosya_adi;
        if (move_uploaded_file($gecici_yol, $hedef)) {
            echo "$dosya_adi yüklendi.<br>";
        }
    }
}

}

Dosya Yükleme Güvenlik Tablosu​


ÖnlemNeden Gerekli?Uygulama Yöntemi
Rastgele İsimlendirmeAynı isimli dosyaların üzerine yazılmasını ve tahmin edilebilirliği önler.uniqid() veya random_bytes()
MIME Tipi KontrolüUzantı hilelerini (örn: zararlı.php.jpg) engeller.finfo_file() fonksiyonu
Dizin KorumasıYüklenen dosyaların doğrudan çalıştırılmasını engeller..htaccess (php_flag engine off)
Boyut SınırıSunucu disk alanının doldurulmasını (DoS) önler.$_FILES['size'] kontrolü

4. Önemli PHP.ini Ayarları​


Yükleme sınırlarını değiştirmek için sunucunuzdaki php.ini dosyasında şu alanları düzenlemeniz gerekebilir:

  • [] file_uploads = On (Yüklemeleri aktif eder)
    [] upload_max_filesize = 10M (Tek bir dosya için maks. sınır)
    [] post_max_size = 25M (Tüm formun toplam maks. sınırı)
    [] max_file_uploads = 20 (Tek seferde yüklenecek maks. dosya sayısı)

Sonuç​


Dosya yükleme sistemi kurarken "önce güvenlik" prensibiyle hareket etmelisiniz. Kullanıcıdan gelen dosya ismine asla güvenmeyin, dosya içeriğini her zaman sunucu tarafında doğrulayın ve dosyaları erişimi kısıtlanmış klasörlerde saklayın. Bu adımlar, sitenizi zararlı yüklemelerden koruyacak en sağlam kalkandır.
 
Geri
Üst