Php

PHP ile Dosya Yükleme Güvenliği

Aykut AKMAN 1 yıl önce Yorumlar (0) 5 Dakika Okuma
PHP ile Dosya Yükleme Güvenliği
E-Posta : 641 0

Web uygulamaları, kullanıcıların resim, video, belge gibi dosyaları sunucuya yüklemesini ve bu dosyalara erişmesini sağlayarak daha etkileşimli deneyimler sunar. Ancak, dosya yükleme işlemi, web uygulamaları için güvenlik riskleri doğurabilir. Kötü niyetli kullanıcılar, zararlı dosyaları sunucuya yükleyerek, hizmet reddi (DoS) saldırıları gerçekleştirebilir veya kötü amaçlı yazılımları dağıtabilir. Bu nedenle, PHP ile dosya yükleme güvenliğini sağlamak önemlidir. Bu makalede, PHP'de dosya yükleme işlemi için nasıl güvenlik tedbirleri alınacağını öğreneceksiniz.

  1. Dosya Türü Kontrolü

Dosya yükleme formu oluştururken, sadece kabul edilebilir dosya türlerine izin vermelisiniz. Kullanıcılardan yalnızca belirli dosya uzantılarıyla dosya yüklemelerine izin vermek, zararlı dosyaların sunucuya gönderilmesini engelleyebilir.

<?php
   $izin_verilen_turler = array('jpg', 'png', 'gif');

   $dosya_uzantisi = pathinfo($_FILES['dosya']['name'], PATHINFO_EXTENSION);

   if (!in_array($dosya_uzantisi, $izin_verilen_turler)) {

      die("Geçersiz dosya türü! Sadece JPG, PNG ve GIF dosyaları yüklenebilir.");

   }
?>

  1. Dosya Boyutu Kontrolü

Yüklenen dosya boyutunun sınırlı olması, sunucunun kaynaklarının kötü niyetli kullanıcılar tarafından tükenmesini önleyebilir. Ayrıca, kullanıcıların uzun süre beklemesini engelleyerek daha iyi bir deneyim sunabilirsiniz.

<?php
   $maksimum_boyut = 5 * 1024 * 1024; // 5 MB

   if ($_FILES['dosya']['size'] > $maksimum_boyut) {

      die("Dosya boyutu çok büyük! Maksimum 5 MB dosya yüklenebilir.");

   }

?>

  1. Dosya Adı Güvenliği

Kullanıcıların yüklediği dosya adları güvenli olmalıdır. Zararlı karakterler içeren dosya adları sunucu güvenliğini tehlikeye atabilir. Dosya adlarını temizlemek ve istenmeyen karakterleri kaldırmak için aşağıdaki gibi bir işlev kullanabilirsiniz.

<?php
   function guvenli_dosya_adı($dosya_adı) {

      $gecersiz_karakterler = array("\\", "/", ":", "*", "?", "\"", "<", "-->", "|");

      return str_replace($gecersiz_karakterler, "", $dosya_adı);

   }

   $yuklenecek_dosya_adı = guvenli_dosya_adı($_FILES['dosya']['name']);

?>

  1. Sunucu Yolu Güvenliği

Yüklenen dosyaların sunucuda saklandığı yolun güvenli olduğundan emin olun. Dosyaların doğrudan erişilemeyeceği bir klasör oluşturarak, dosya yolu güvenliğini artırabilirsiniz.

<?php
   $hedef_klasor = "uploads/"; // Yüklenen dosyaların saklanacağı klasör

   $tam_yol = $hedef_klasor . $yuklenecek_dosya_adı;

   if (move_uploaded_file($_FILES['dosya']['tmp_name'], $tam_yol)) {

      echo "Dosya başarıyla yüklendi.";

   } else {

      echo "Dosya yüklenirken bir hata oluştu.";

   }

?>

  1. DoS Saldırılarından Korunma

Dosya yükleme sırasında DoS saldırılarından korunmak için, büyük dosyaların sürekli olarak yüklenmesini önlemek için uygun sınırlamaları belirleyebilirsiniz. Örneğin, belirli bir süre içinde aynı IP adresinden yapılan yükleme sayısını sınırlandırabilirsiniz.

  1. İstek Sayısını Sınırlama:

Bir IP adresinden belirli bir süre içinde yapılan istek sayısını sınırlayarak DoS saldırılarından korunabilirsiniz. Aşağıdaki örnek kod, 1 dakika içinde bir IP adresinden en fazla 10 isteğe izin verir.

<?php
   $limit = 10; // İzin verilen istek limiti

   $ip_adresi = $_SERVER['REMOTE_ADDR'];

   $zaman_araligi = 60; // 60 saniye (1 dakika)

   $dosya = 'dosya.txt'; // IP ve zaman bilgilerinin tutulacağı dosya

   $bilgiler = file($dosya, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

   // Belirtilen süre içindeki istekleri sayma

   $istek_sayisi = 0;

   foreach ($bilgiler as $bilgi) {

      list($ip, $zaman) = explode('|', $bilgi);

      if ($ip == $ip_adresi && time() - $zaman <= $zaman_araligi) {

         $istek_sayisi++;

      }
   }

   // Dosyaya IP ve zaman bilgilerini ekleme

   file_put_contents($dosya, "$ip_adresi|" . time() . "\n", FILE_APPEND);

   if ($istek_sayisi > $limit) {

      die("Çok fazla istek yapıldı. Lütfen bir süre sonra tekrar deneyin.");

   }

?>

  1. DoS Saldırıları için Zamanlama Kontrolü:

DoS saldırıları genellikle hızlı ardışık isteklerle gerçekleştirilir. Bu durumu kontrol edebilmek için, ardışık istekler arasında belirli bir gecikme olup olmadığını kontrol edebilirsiniz.

<?php
   $gecikme_suresi = 1; // 1 saniye gecikme

   $son_istek = isset($_SESSION['son_istek']) ? $_SESSION['son_istek'] : 0;

   $su_an = time();

   if ($su_an - $son_istek < $gecikme_suresi) {

      die("Lütfen bir süre sonra tekrar deneyin.");

   }

   $_SESSION['son_istek'] = $su_an;

?>

Bu kod, iki ardışık istek arasında en az 1 saniyelik bir gecikme olmasını sağlar. session_start() öncesinde kullanarak oturumları kontrol edebilirsiniz.

Önemli Not: Yukarıdaki kod örnekleri, DoS saldırılarından korunma için temel bir seviyede önlemler içerir. Gerçek bir uygulamada daha gelişmiş koruma mekanizmaları ve sunucu yapılandırmaları gerekebilir. Daha karmaşık ve güvenilir koruma önlemleri için uygulamanızın ihtiyaçlarına uygun güvenlik önlemleri uygulamanız önemlidir.

Bu makalede, PHP ile dosya yükleme güvenliği için alınabilecek önemli tedbirleri inceledik. Dosya yükleme işlemi, web uygulamaları için önemli bir özellik olsa da, güvenlik açıkları potansiyel riskleri beraberinde getirebilir. Yukarıda verilen güvenlik önlemlerini uygulayarak, kullanıcıların güvenli ve güvenilir bir şekilde dosya yüklemesini sağlayabilir ve web uygulamanızın güvenliğini artırabilirsiniz.

Sıkça Sorulan Sorular

PHP ile dosya yüklerken güvenliği sağlamak için, dosya türü kontrolü yapmalı, yalnızca güvenli dosya uzantılarına izin vermelisiniz. Ayrıca, dosya boyutunu sınırlamalı ve dosya adlarını güvenli hale getirmelisiniz. Dosya yollarının doğru şekilde yapılandırılması ve kullanıcıdan alınan dosyaların zararlı yazılım içermediğinden emin olunması gereklidir.

PHP'de dosya boyutunu sınırlamak için, $_FILES['dosya']['size'] özelliğini kontrol edebilirsiniz. Örneğin, dosya boyutunu 5MB ile sınırlamak için şu kodu kullanabilirsiniz:

if ($_FILES['dosya']['size'] > 5 * 1024 * 1024) {  
    die("Dosya boyutu çok büyük! Maksimum 5 MB dosya yüklenebilir.");  
}

Kullanıcıların yüklediği dosya adlarını güvenli hale getirmek için zararlı karakterleri kaldırmalısınız. Örneğin, aşağıdaki fonksiyon, dosya adındaki geçersiz karakterleri temizler:

function guvenli_dosya_adı($dosya_adı) {  
    $gecersiz_karakterler = array("\\", "/", ":", "*", "?", "\"", "<", ">", "|");  
    return str_replace($gecersiz_karakterler, "", $dosya_adı);  
}

DoS saldırılarından korunmak için IP adreslerine göre istek sayısını sınırlayabilir veya ardışık dosya yükleme isteklerine karşı bir gecikme ekleyebilirsiniz. Bu tür önlemler için, kullanıcıların dosya yükleme isteklerini izlemek ve aşırı istekleri engellemek önemlidir. Aşağıdaki kod, belirli bir IP adresinden aşırı istek yapılmasını engeller:

if ($istek_sayisi > $limit) {  
    die("Çok fazla istek yapıldı. Lütfen bir süre sonra tekrar deneyin.");  
}

Dosya yüklerken yalnızca belirli, güvenli dosya türlerine izin verilmelidir. Genellikle resim dosyaları (jpg, png, gif) veya metin dosyaları (txt) gibi dosyalar kabul edilir. Dosya türlerini kontrol etmek için pathinfo() ve in_array() fonksiyonları kullanılabilir.

$izin_verilen_turler = array('jpg', 'png', 'gif');  
$dosya_uzantisi = pathinfo($_FILES['dosya']['name'], PATHINFO_EXTENSION);  
if (!in_array($dosya_uzantisi, $izin_verilen_turler)) {  
    die("Geçersiz dosya türü! Sadece JPG, PNG ve GIF dosyaları yüklenebilir.");  
}

PHP ile dosya yükleme sırasında birkaç hata meydana gelebilir:

  • Dosya boyutu sınırını aşma (PHP yapılandırmasında belirlenen limitler)
  • Geçersiz dosya türü yüklenmesi
  • Dosya adı içindeki geçersiz karakterler
  • Hedef klasöre dosya yazma izinlerinin olmaması
    Bu hataların önüne geçmek için uygun kontroller yapılmalı ve kullanıcı dostu hata mesajları sağlanmalıdır.
Aykut AKMAN

Aykut AKMAN

Bilişim Öğretmeni

Bu Gönderiye Yorum Yapılmamış

Yorum Yap

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlendi.

Diğer Yazılar

Arduino Kara Şimşek Uygulaması

Aykut AKMAN 10 ay önce