PHP ile Güvenli Dosya Upload İşlemleri

Bu makalemde PHP ile güvenli bir şekilde nasıl dosya upload edebileceğimizi anlatacağım. Faydalı olması dileğiyle…

Güvenli dosya upload için iki tane dosyamız olacak. Bunlardan ilki formun bulunduğu HTML dosyamız. Diğeri, upload ve kontrol işlemlerini yapacağımız PHP dosyamız. Önce yüklenecek dosyamızın seçileceği HTML formumuzu hazırlayalım. HTML formumuz index.php dosyamızda. Bu kısımda sorun yok. Burada can alıcı nokta PHP dosyamız.

Yukarıda upload edilecek olan dosyamızın seçileceği formun kodları görülmektedir. Bir HTML form oluşturduk. Verilerin upload.php’ye gönderildiğine dikkat ediniz. Bu formumuza iki adet eleman ekledik. Bunlardan ilki upload edilecek dosyanın seçileceği eleman. Diğeri ise formu gönderecek buton. HTML formumuzu oluşturduk. Formdaki veriler upload.php dosyasına gönderilecek. Bununla birlikte upload.php dosyasında gönderilen dosya hakkında bazı bilgiler elde etmemiz gerekecek. İşte bu bilgileri aşağıdaki kodlar ile elde edeceğiz.

$_FILES[“dosya”][“tmp_name”];
$_FILES[“dosya”][“name”];
$_FILES[“dosya”][“type”];
$_FILES[“dosya”][“size”];

tmp_name ile kaynağın bilgilerini elde ederiz. Name ile dosyanın ismini, type ile türünü, size ile boyutunu öğreniriz. İleride kullancağımız bu bilgileri de verdikten sonra güvenliği sağlamak için kullacağımız yöntemlere geçelim.

Dosya Uzantısını Kontrol Etme

Bu yöntem ile sunucuya yüklenen dosyanın uzantısını kontrol edeceğiz. Bunun için yazacağımız kod aşağıdaki gibi olacaktır.

Dosyaadi değişkenimize dosyamızın adını bütün harflerini küçülterek aktardık. Neden küçülterek aktardık? Çünkü Stringler büyük küçük harfe karşı duyarlıdır. İzinli değişkenimize izinli olan dosya tiplerini, izinsiz değişkenimize izin verilmeyen dosya uzantılarımızı dizi halinde yazdık. Daha sonra iki adet koşul sorgusuyla bu uzantıların dosyamıza ait olup olmadığını sorguladık. İki çeşit sorgu koyduk. Bunlardan herhangi birini kullanabilirsiniz. İkisi de hemen hemen aynıdır. Farkları birindi sadece belirlediklerinize izin verirsiniz. Diğerinde belirlediklerinizin dışında hepsine izin verirsiniz.

Alternatif olarak yukarıdaki kodu da kullanabilirsiniz. Şahsen ben bunu kullanmanızı öneririm. Bu işlemin mantığı dosya ismindeki noktaları saydırarak bir diziye eklemek ve bu dizinin elemanının 1 den büyük olmadığını denetlemek. Eğer 1 den büyük ise programdan exit(0) ile çıkıyoruz.

Dosya Boyutu Sınırlama

Sunucuya dosya yüklemi işlemine dosya boyutu sınırı getirilebilir. Bu sınır sayesinde sunucuya aşırı yüklenmenin de önüne geçilmiş olur. Bu işlemi başarılı bir şekilde yapabilmek için aşağıdaki kodları kullanabiliriz.

Yukarıda daha önce anlattığımız $_FILES bilgisi ve koşul sorgusuyla sorguyu kolaylıkla yapabiliriz. Sorguda girdiğimiz 100000 sayısı maximum dosya boyutunun byte cinsinden değeridir. Burada belirtmem gereken diğer bir husus php.ini dosyasındaki post_max_size değeridir. Siz yukarıdaki sorguda sınırı ne kadar yukarıda tutarsanız tutun, php.ini’deki değeri geçemezsiniz. Bu yüzden büyük boyutlu dosya yükleme işlemleri için php.ini dosyasındaki post_maz_size değerini ayarlamanız gerekmektedir.

Rastgele Dosya İsmi Belirlemek

Güvenliğin ön planda olduğu sistemlerde kullanıcıların yüklenen verilere doğrudan erişmesin izin verilmemektedir. Bunun için sunucuya yüklenen dosyaların isimleri, yüklenmeden önceki isimden farklı olarak değiştirilmektedir. İsim değiştirilmeden hazırlanan sistemlerde kullanıcı dosya ismini kullanarak sunucuya yüklediği dosyayı çalıştırabilir. Bunu engellemk için isim değiştirme işlemi yapılır. Bunun örneklerini yüksek seviyedeki bir çok sistemde görebilmekteyiz. Şimdi bu sistemi kendimiz yapalım.

Şimdi yukarıdaki kodlarımızı açıklayalım. Dosyamızın adını ve yüklendiği dizini belirttik. Sonra end ve explode fonksiyonlarını kullanarak dosyanın uzantısını sonradan kullanmak üzere elde ettik. Dosyamızın yeni adını dosyanın eski ismini ve time fonksiyonundan elde ettiğimiz zamanı birleştirip md5 ile şifreleyerek elde ettik. Bu kısım kişisel tercihlere göre değişiklik gösterebilir. İsterseniz ön ek, son ek vb. Ekleyebilirsiniz. Daha sonra yüklenen dosyanın ismini değiştirdik. Hata olursa ekrana yazdırdık.

Sorularınızı yorum yaparak sorabilirsiniz.

Selametle…

Bir önceki yazımız olan PHP Filter Fonksiyonları ve Kullanımları başlıklı makalemizde PHP Dersleri, PHP Filter Dersleri ve PHP Filter Fonksiyonları hakkında bilgiler verilmektedir.

About This Author

Uzun yıllardır yazılım ile uğraşıyorum. PHP ile başladığım yazılım hayatıma şu an PHP'nin yanında Swift ve Python ile devam ediyorum. Bu güne kadar bir çok proje geliştirdim ve yeni projeler geliştirmeye de devam ediyorum. Bu sitede yazılımseverlere faydalı bilgiler vermeye, yazılım geliştirmeye, öğrendiklerimi paylaşmaya, yeni başlayanlara yol göstermeye ve onlara yardımcı olmaya çalışıyorum.

1 Comment

You can post comments in this post.


  • merhaba
    güzel makale teşekkürler. plupload ve verot.net sınıflarının anlatımlarını da kaleme alırmısınız?

    heros 1 ay ago Reply


Post A Reply