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.
Dosya yüklemek için HTML formunda enctype="multipart/form-data" parametresi mutlaka bulunmalıdır. Aksi takdirde $_FILES dizisi boş dönecektir.
Dosya yüklerken sadece uzantıya bakmak (örn: .jpg) güvenli değildir. MIME tipini ve dosya içeriğini kontrol etmek gerekir.
Birden fazla dosya gönderildiğinde $_FILES dizisinin yapısı biraz karmaşıklaşır. Bu yapıyı bir döngü ile çözmemiz gerekir.
Yükleme sınırlarını değiştirmek için sunucunuzdaki php.ini dosyasında şu alanları düzenlemeniz gerekebilir:
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.
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['REQUEST_METHOD'] == 'POST' && 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['dosya'];
// 1. Hata Kontrolü
if ($dosya['error'] !== UPLOAD_ERR_OK) {
$hata_mesajlari[] = "Yükleme sırasında bir hata oluştu.";
}
// 2. Boyut Kontrolü
if ($dosya['size'] > $maks_boyut) {
$hata_mesajlari[] = "Dosya boyutu 2MB'den büyük olamaz.";
}
// 3. Tip Kontrolü (finfo kullanımı en güvenlisidir)
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mime_tipi = $finfo->file($dosya['tmp_name']);
if (!in_array($mime_tipi, $izin_verilen_tipler)) {
$hata_mesajlari[] = "Sadece JPG, PNG ve GIF yükleyebilirsiniz.";
}
// 4. Güvenli İsimlendirme ve Taşıma
if (empty($hata_mesajlari)) {
$uzanti = pathinfo($dosya['name'], PATHINFO_EXTENSION);
$yeni_isim = bin2hex(random_bytes(10)) . '.' . $uzanti;
$hedef = $yukleme_dizini . $yeni_isim;
if (move_uploaded_file($dosya['tmp_name'], $hedef)) {
echo "Dosya başarıyla yüklendi: " . $yeni_isim;
} else {
echo "Dosya taşıma hatası.";
}
} else {
foreach ($hata_mesajlari as $hata) echo $hata . "<br>";
}
}
?>
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
| Önlem | Neden Gerekli? | Uygulama Yöntemi |
|---|---|---|
| Rastgele İsimlendirme | Aynı 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.