PHP ile Dosya Yükleme ve Güvenlik Önlemleri

PHP ile Dosya Yükleme ve Güvenlik Önlemleri

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;

<input type=”file” accept=”.pdf”> //Sadece .pdf uzantılı dosyalar seçilebilir.
<input type=”file” accept=”.jpg, .jpeg, .png, .gif”> //Kullanıcı sadece .jpg, .jpeg, .png veya .gif yükleyebilir.
<input type=”file” accept=”image/*”> //Tüm resim dosyalarını (.jpg, .png, .gif, .svg, vb.) kabul eder.
<input type=”file” accept=”audio/*”> //Bu, .mp3, .wav, .ogg, vb. tüm ses dosyalarını kabul eder.
<input type=”file” accept=”.pdf, .doc, .docx, .xls, .xlsx, .ppt, .pptx”> //Kullanıcı sadece belirtilen belge türlerini yükleyebilir.

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:

Yorum gönder

This site uses Akismet to reduce spam. Learn how your comment data is processed.