Web uygulamalarında dosya yükleme işlemi, kullanıcıların belge, resim veya diğer medya dosyalarını sisteme yüklemelerini sağlamak için sıkça kullanılan bir özelliktir. Ancak, güvenlik açıklarına karşı dikkatli olmak gerekir. Kötü niyetli kişiler, zararlı dosyaları yükleyerek sistemlere zarar verebilir.
Bu yazıda, PHP ile güvenli dosya yükleme yöntemlerini adım adım inceleyeceğim.
1. PHP ile Temel Dosya Yükleme İşlemi
PHP’de dosya yükleme işlemi için $_FILES
süper global değişkeni kullanılır.
1️⃣ HTML Form ile Dosya Yükleme
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="dosya">
<input type="submit" value="Yükle">
</form>
📌 Önemli: enctype="multipart/form-data"
eklenmezse dosya yükleme çalışmaz.
<input type="file" name="dosya">
kısmına accept ekleyebiliriz ve bu da daha tarayıcıdan hatalı dosya yüklenmesini önler. Birkaç örnek vereyim;
.jpg
, .jpeg
, .png
veya .gif
yükleyebilir..jpg
, .png
, .gif
, .svg
, vb.) kabul eder..mp3
, .wav
, .ogg
, vb. tüm ses dosyalarını kabul eder.2️⃣ PHP ile Dosyayı Alma ve Kaydetme
if ($_FILES["dosya"]["error"] == 0) {
$hedef_klasor = "uploads/";
$hedef_dosya = $hedef_klasor . basename($_FILES["dosya"]["name"]);
if (move_uploaded_file($_FILES["dosya"]["tmp_name"], $hedef_dosya)) {
echo "Dosya başarıyla yüklendi: " . $hedef_dosya;
} else {
echo "Dosya yüklenirken hata oluştu.";
}
}
Bu kod, dosyayı uploads/
klasörüne taşır. Ancak, güvenlik önlemleri alınmazsa zararlı dosya yüklenmesine sebep olabilir.
2. PHP ile Dosya Yükleme Güvenlik Önlemleri
Dosya yükleme işlemi sırasında dikkat edilmesi gereken güvenlik önlemleri:
1️⃣ Dosya Türü Kontrolü (MIME Type Kontrolü)
Sadece belirli dosya türlerine izin vererek güvenliği artırabilirsiniz:
$izin_verilen_tipler = array("image/jpeg", "image/png", "image/gif");
$dosya_tipi = mime_content_type($_FILES["dosya"]["tmp_name"]);
if (!in_array($dosya_tipi, $izin_verilen_tipler)) {
die("Bu dosya türüne izin verilmiyor!");
}
✅ Sadece resim formatındaki dosyaları kabul eder.
2️⃣ Dosya İsmini Güvenli Hale Getirme
Dosya isimlerini rastgele atayarak, zararlı dosyaların çalıştırılmasını engelleyebilirsiniz:
$dosya_uzantisi = pathinfo($_FILES["dosya"]["name"], PATHINFO_EXTENSION);
$yeni_dosya_adi = uniqid() . "." . $dosya_uzantisi;
$hedef_dosya = "uploads/" . $yeni_dosya_adi;
✅ Bu yöntem, orijinal dosya ismini güvenli hale getirir.
3️⃣ Yüklenen Dosyanın Boyutunu Sınırlandırma
Büyük boyutlu dosyaların yüklenmesini engellemek için:
$max_boyut = 2 * 1024 * 1024; // 2MB
if ($_FILES["dosya"]["size"] > $max_boyut) {
die("Dosya boyutu çok büyük!");
}
✅ 2MB’den büyük dosyaların yüklenmesini engeller.
4️⃣ Sadece Belirli Klasöre Yükleme
Dosyaların yalnızca belirli bir klasöre yüklenmesini sağlamak için:
if (!is_uploaded_file($_FILES["dosya"]["tmp_name"])) {
die("Geçersiz dosya yükleme işlemi!");
}
✅ Dosyanın doğrudan bir istemci tarafından yüklenip yüklenmediğini kontrol eder.
5️⃣ PHP Konfigurasyonu ile Güvenlik Önlemleri
PHP’nin php.ini
dosyasında şu ayarları yaparak güvenliği artırabilirsiniz:
file_uploads = On
upload_max_filesize = 2M
post_max_size = 3M
✅ Bu ayarlar, yükleme boyutunu sınırlandırır.
3. Örnek Proje: Resim Yükleme ve Görüntüleme
Şimdi tüm güvenlik önlemlerini içeren bir resim yükleme ve görüntüleme scripti oluşturalım.
1️⃣ HTML Form
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="dosya">
<input type="submit" value="Yükle">
</form>
2️⃣ Güvenli PHP Upload Scripti
if ($_FILES["dosya"]["error"] == 0) {
$izin_verilen_tipler = array("image/jpeg", "image/png", "image/gif");
$dosya_tipi = mime_content_type($_FILES["dosya"]["tmp_name"]);
if (!in_array($dosya_tipi, $izin_verilen_tipler)) {
die("Bu dosya türüne izin verilmiyor!");
}
$dosya_uzantisi = pathinfo($_FILES["dosya"]["name"], PATHINFO_EXTENSION);
$yeni_dosya_adi = uniqid() . "." . $dosya_uzantisi;
$hedef_dosya = "uploads/" . $yeni_dosya_adi;
if (move_uploaded_file($_FILES["dosya"]["tmp_name"], $hedef_dosya)) {
echo "Dosya başarıyla yüklendi: <img src='$hedef_dosya' width='200'>";
} else {
echo "Dosya yüklenirken hata oluştu.";
}
}
✅ Bu script, yüklenen resmi göstererek güvenli bir yükleme işlemi yapar.
PHP ile dosya yükleme işlemi güvenlik açıklarına karşı dikkatli yönetilmelidir. Zararlı dosya yüklenmesini engellemek için aşağıdaki önlemleri almalısınız: