PHP de Dosya Gönderim ( File Upload )
Bu dökümanda size PHP ile nasıl ; ’’ Dosya Gönderildiği / File Upload ’’ konusunda bazı bilgiler vermek istiyorum Aşağıda yazılı olanlar her zaman tekrarladığım gibi en basit ve sade dille anlatılmıştır Bunun nedeni bir kod parçacığının ne kadar ilerlerse okadar karmaşıklaşmasıdır Tabi basit derken abartılmış bir derecede basitlik olmıyacak
Dökümanın akışı sırasında sizlere sık sık önemli notlar vermeye çalışacam bu sayede ’’ Dosya Gönderme ’’ işleminin güvenlik açıklarınıda öğrenmiş olacaksınız Fazla geyiğe girmeden hemen dökümana başlıyorum
Aşağıdaki kodu bir dosyaya kaydedin
<form name=’’form1’’ enctype=’’multipart/form-data’’ action=’’<? echo $PHP_SELF;?>’’ method=’’post’’><input type=’’file’’ name=’’dosya’’><br><input type=’’submit’’ name=’’gonder’’ value=’’Gönder’’></form>
<?if(@$gonder == ’’Gönder’’) {copy ( $dosya, $dosya_name ) or die ( ’’Dosya Kopyalanamiyor’’ );echo $dosya_name;echo ’’<br>’’;echo $dosya_size ’’ Kb’’;echo ’’<br>’’;echo $dosya_type;echo ’’<br>’’;echo ’’<a href= "’$dosya_name’’>Tiklayiniz</a>’’;}?>
Yukarıdaki kodlara göz attığımız zaman html ve php kodlarını göreceksiniz Şimdi bu kodları anlatmaya başlamadan önce ilk denememizi yapalım Dosyayı kaydedip çalıştırdığınız zaman Karşınıza iki tane form elamanı çıkacak İkiside web sayfalarından görmeye alışık olduğunuz elamanlar
Bunlardan biri dosya göndermenizi sağlayan ’’ Form - File ’’ elamanı Diğeri ise ’’ Form - Button ’’
Şimdi Browse tuşuna basip bir dosya seçelim ( Resim Dosyası seçebilirsiniz ) sonrada gönder tuşuna basalım
Muhtemelen ( klasöre yazma izinleri vs gibi etkenler yoksa ) aşağıdaki gibi bir çıktı alacaksınız
dosyadixxx
15723 Kb
image/pjpeg
Tıklayınız
İlk satırda dosya adı, sonrakinde dosya boyutu, sonrakinde dosya tipi ve en sonda tıklayın adlı bir link Eğer gönderdiğiniz dosya bir resim yada benzeri bir dosya ise bu linke tıklayarak resmi görebileceksiniz
Not : Eğer sunucunuzun kendi üzerinde çalıştıramıyacağı bir dosya ise ; bu dosyayı download etmeniz için size gönderecektir
Buraya kadar yazılanlar bu işe yeni başlamış arkadaşlar için açıklayıcı nitelikteydi şimdi kodları teker teker açıklmaya başlıyalım
form name=’’form1’’ enctype=’’multipart/form-data’’ action=’’<? echo $PHP_SELF;?>’’ method=’’post’’> // bu satırı html den biraz anlıyan yada daha önce web sayfası yapmış olan pek çok kişi bilecektir <form name=’’form1’’ // bu bölüm ie form1 adında bir form oluşturduk enctype=’’multipart/form-data bu alan ile form tipini belirledir
action=’’<? echo $PHP_SELF;?>’’ // bu satırda formun gönder tuşuna bastığımız zaman form bilgilerinin hangi dosyaya gönderileceğini belirledik Anlıyacağınız gibi PHP nin kendinden gelen $PHP_SELF değişkeni ile form bilgilerini tekrar aynı dosyaya gönderdik Bunun nedenini birazdan göreceksiniz
method=’’post’’ // bu bölüm ilede formumuzun bilgileri göndereceği zamanki metodu belirledik
Not : Form methodu olarak ( Java vs hariç ) iki adet method vardır bunlardan biri ’’ post’’ diğeri ’’get’’ İkisi arasındaki temel fark ; post metodunda gönderilen form bilgileri URL kısmında görülmezken, get methodunda form bilgileri URL kısmında görünür Teknik olarak hemen herkesin post methodu kullanmak istemesi düşünülsede her ikisininde farklı özellikleri vardır ( Konumuz dışında olduğu için uzatmıyorum Gerekirse ileride bir döküman yazarız )
<input type=’’file’’ name=’’dosya’’> // ikinci satırda ise dosya göndermemizi sağlayan bir ’’ Form - File ’’ elamanı yaptık Burada name=’’dosya’’ ki alanda; ’’ name ’’ in bir değişken ve değerinin ’’dosya’’ olduğunu belirteyim
<input type=’’submit’’ name=’’gonder’’ value=’’Gönder’’> // bu satırda yine formdaki bilgileri istediğimiz dosyaya göndermemizi sağlayan ’’ Form - Submit ’’ elemanını kullandık name=’’gonder’’ value=’’Gönder’’ buradan anlıyacağınız gibi ’’ gonder ’’ adında ve değeri ’’ Gönder ’’ olan bir değişken tanımladık
</form> // bu satır ilede form alanımızı bitirdik ( html de formlar <form> </form> arasındaki bilgileri gönderir Bu alan dışındaki bilgiler işlenmez )
Şimdi gelelim php kodlarımıza
<?
if(@$gonder == ’’Gönder’’) { // bu satır ile önce <? ile php kodumuzu başlattık sonra php nin koşul fonksiyonlarından biri olan if() ( eğer ) fonksiyonu ile mantık olarak şöyle bir şey yazdık
Eğer $gonder değişkeninin değeri ’’Gönder’’ değerine eşitse aşağıdaki kodları uygula $gonder değişkeninin başında @ işaretide böyle bir değişken yoksa hata mesajı verme anlamındadır
Not : Dökümanın başında bahsettiğim dosya gönderme işleminin tek dosyada yapılması bu sayde oluşuyor Yani form gönderilmediği sürece dosyayı çalıştırdığınız zaman karşınıza sadece ; dosya seçme ve gönderme butonları çıkıyor Eğer dosya göndere basarsak <input type=’’submit’’ name=’’gonder’’ value=’’Gönder’’> bu satır vasıtasıyla $gonder değişkeninin değeri ’’ Gönder ’’ olduğundan php kodlarımız çalışmaya başlıyor
copy ( $dosya, $dosya_name ) or die ( ’’Dosya Kopyalanamıyor’’ ); // bu satır ile php deki copy() fonksiyonu kullanılarak $dosya değişkeni ( formdan gelen ) , $dosya değişkeninin _name dizesi adıyla kaydediliyor
echo $dosya_name; // bu satır ile $dosya değişkeninin adını ( name dizesini ) ekrana bastırıyoruz
echo $dosya_size ’’ Kb’’; // bu satır ile $dosya değişkeninin size ( boyut ) dizesini
echo $dosya_type; // bu satır ilede dosya tipini ekrana bastırıyoruz
echo ’’<a href= "’$dosya_name’’>Tıklayınız</a>’’; // bu satır ilede html de yazılara yada nesnelere link vermemizi sağlayan <a href> komutu ile gönderdiğimiz dosyanın adına bir link veriyoruz
}
?> // son olarak bu satırlarlada kodumuzu bitiriyoruz
Dikkat edilmesi gereken hususlar ve püf noktalar :
- Dosya gönderme islemlerinde dikkat edilmesi gereken en önemli seylerden biri; sitenize gelen bir saldirganin sitenize zarar vermek amaciyla sisteminize göndermek isteyecegi kötü kodlardir Mesala php kodlarinizdaki degiskenleri ( database sifre degiskenleri, kullanici sifre degiskenleri vs ) ögrenmek için belirli bir kod yazabilirlerBunun için gönderilen dosyalarda çesitli scriptlerle belirli dosya uzantilarini yasakliyabilirsiniz
- Sitenize gelen saldirgan çok büyük dosya boyutlari ile web alaninizi düsürmek için girisimdebulunabilir Bunun için form nesneleriniz arasina dosya boyutunu sinirlaran <INPUT TYPE=’’hidden’’ NAME=’’MAX_FILE_SIZE’’ VALUE=’’500000’’> su satiri ekleyebilirsiniz
- Sitenize gelen saldirgan dosya gönderirken; dosyanin gönderilecegi dizini degistirerek sizin belirttiginiz klasör disina ulasabilir
- Mantik olarak bu gün çogu kisi tarafindan bilinen pek çok fikirlerden yaralanarak sitenize zarar vermemesi için en ince ayrintilara kadar düsünmek sizlerin görevidir
Bu dökümanda size PHP ile nasıl ; ’’ Dosya Gönderildiği / File Upload ’’ konusunda bazı bilgiler vermek istiyorum Aşağıda yazılı olanlar her zaman tekrarladığım gibi en basit ve sade dille anlatılmıştır Bunun nedeni bir kod parçacığının ne kadar ilerlerse okadar karmaşıklaşmasıdır Tabi basit derken abartılmış bir derecede basitlik olmıyacak
Dökümanın akışı sırasında sizlere sık sık önemli notlar vermeye çalışacam bu sayede ’’ Dosya Gönderme ’’ işleminin güvenlik açıklarınıda öğrenmiş olacaksınız Fazla geyiğe girmeden hemen dökümana başlıyorum
Aşağıdaki kodu bir dosyaya kaydedin
<form name=’’form1’’ enctype=’’multipart/form-data’’ action=’’<? echo $PHP_SELF;?>’’ method=’’post’’><input type=’’file’’ name=’’dosya’’><br><input type=’’submit’’ name=’’gonder’’ value=’’Gönder’’></form>
<?if(@$gonder == ’’Gönder’’) {copy ( $dosya, $dosya_name ) or die ( ’’Dosya Kopyalanamiyor’’ );echo $dosya_name;echo ’’<br>’’;echo $dosya_size ’’ Kb’’;echo ’’<br>’’;echo $dosya_type;echo ’’<br>’’;echo ’’<a href= "’$dosya_name’’>Tiklayiniz</a>’’;}?>
Yukarıdaki kodlara göz attığımız zaman html ve php kodlarını göreceksiniz Şimdi bu kodları anlatmaya başlamadan önce ilk denememizi yapalım Dosyayı kaydedip çalıştırdığınız zaman Karşınıza iki tane form elamanı çıkacak İkiside web sayfalarından görmeye alışık olduğunuz elamanlar
Bunlardan biri dosya göndermenizi sağlayan ’’ Form - File ’’ elamanı Diğeri ise ’’ Form - Button ’’
Şimdi Browse tuşuna basip bir dosya seçelim ( Resim Dosyası seçebilirsiniz ) sonrada gönder tuşuna basalım
Muhtemelen ( klasöre yazma izinleri vs gibi etkenler yoksa ) aşağıdaki gibi bir çıktı alacaksınız
dosyadixxx
15723 Kb
image/pjpeg
Tıklayınız
İlk satırda dosya adı, sonrakinde dosya boyutu, sonrakinde dosya tipi ve en sonda tıklayın adlı bir link Eğer gönderdiğiniz dosya bir resim yada benzeri bir dosya ise bu linke tıklayarak resmi görebileceksiniz
Not : Eğer sunucunuzun kendi üzerinde çalıştıramıyacağı bir dosya ise ; bu dosyayı download etmeniz için size gönderecektir
Buraya kadar yazılanlar bu işe yeni başlamış arkadaşlar için açıklayıcı nitelikteydi şimdi kodları teker teker açıklmaya başlıyalım
form name=’’form1’’ enctype=’’multipart/form-data’’ action=’’<? echo $PHP_SELF;?>’’ method=’’post’’> // bu satırı html den biraz anlıyan yada daha önce web sayfası yapmış olan pek çok kişi bilecektir <form name=’’form1’’ // bu bölüm ie form1 adında bir form oluşturduk enctype=’’multipart/form-data bu alan ile form tipini belirledir
action=’’<? echo $PHP_SELF;?>’’ // bu satırda formun gönder tuşuna bastığımız zaman form bilgilerinin hangi dosyaya gönderileceğini belirledik Anlıyacağınız gibi PHP nin kendinden gelen $PHP_SELF değişkeni ile form bilgilerini tekrar aynı dosyaya gönderdik Bunun nedenini birazdan göreceksiniz
method=’’post’’ // bu bölüm ilede formumuzun bilgileri göndereceği zamanki metodu belirledik
Not : Form methodu olarak ( Java vs hariç ) iki adet method vardır bunlardan biri ’’ post’’ diğeri ’’get’’ İkisi arasındaki temel fark ; post metodunda gönderilen form bilgileri URL kısmında görülmezken, get methodunda form bilgileri URL kısmında görünür Teknik olarak hemen herkesin post methodu kullanmak istemesi düşünülsede her ikisininde farklı özellikleri vardır ( Konumuz dışında olduğu için uzatmıyorum Gerekirse ileride bir döküman yazarız )
<input type=’’file’’ name=’’dosya’’> // ikinci satırda ise dosya göndermemizi sağlayan bir ’’ Form - File ’’ elamanı yaptık Burada name=’’dosya’’ ki alanda; ’’ name ’’ in bir değişken ve değerinin ’’dosya’’ olduğunu belirteyim
<input type=’’submit’’ name=’’gonder’’ value=’’Gönder’’> // bu satırda yine formdaki bilgileri istediğimiz dosyaya göndermemizi sağlayan ’’ Form - Submit ’’ elemanını kullandık name=’’gonder’’ value=’’Gönder’’ buradan anlıyacağınız gibi ’’ gonder ’’ adında ve değeri ’’ Gönder ’’ olan bir değişken tanımladık
</form> // bu satır ilede form alanımızı bitirdik ( html de formlar <form> </form> arasındaki bilgileri gönderir Bu alan dışındaki bilgiler işlenmez )
Şimdi gelelim php kodlarımıza
<?
if(@$gonder == ’’Gönder’’) { // bu satır ile önce <? ile php kodumuzu başlattık sonra php nin koşul fonksiyonlarından biri olan if() ( eğer ) fonksiyonu ile mantık olarak şöyle bir şey yazdık
Eğer $gonder değişkeninin değeri ’’Gönder’’ değerine eşitse aşağıdaki kodları uygula $gonder değişkeninin başında @ işaretide böyle bir değişken yoksa hata mesajı verme anlamındadır
Not : Dökümanın başında bahsettiğim dosya gönderme işleminin tek dosyada yapılması bu sayde oluşuyor Yani form gönderilmediği sürece dosyayı çalıştırdığınız zaman karşınıza sadece ; dosya seçme ve gönderme butonları çıkıyor Eğer dosya göndere basarsak <input type=’’submit’’ name=’’gonder’’ value=’’Gönder’’> bu satır vasıtasıyla $gonder değişkeninin değeri ’’ Gönder ’’ olduğundan php kodlarımız çalışmaya başlıyor
copy ( $dosya, $dosya_name ) or die ( ’’Dosya Kopyalanamıyor’’ ); // bu satır ile php deki copy() fonksiyonu kullanılarak $dosya değişkeni ( formdan gelen ) , $dosya değişkeninin _name dizesi adıyla kaydediliyor
echo $dosya_name; // bu satır ile $dosya değişkeninin adını ( name dizesini ) ekrana bastırıyoruz
echo $dosya_size ’’ Kb’’; // bu satır ile $dosya değişkeninin size ( boyut ) dizesini
echo $dosya_type; // bu satır ilede dosya tipini ekrana bastırıyoruz
echo ’’<a href= "’$dosya_name’’>Tıklayınız</a>’’; // bu satır ilede html de yazılara yada nesnelere link vermemizi sağlayan <a href> komutu ile gönderdiğimiz dosyanın adına bir link veriyoruz
}
?> // son olarak bu satırlarlada kodumuzu bitiriyoruz
Dikkat edilmesi gereken hususlar ve püf noktalar :
- Dosya gönderme islemlerinde dikkat edilmesi gereken en önemli seylerden biri; sitenize gelen bir saldirganin sitenize zarar vermek amaciyla sisteminize göndermek isteyecegi kötü kodlardir Mesala php kodlarinizdaki degiskenleri ( database sifre degiskenleri, kullanici sifre degiskenleri vs ) ögrenmek için belirli bir kod yazabilirlerBunun için gönderilen dosyalarda çesitli scriptlerle belirli dosya uzantilarini yasakliyabilirsiniz
- Sitenize gelen saldirgan çok büyük dosya boyutlari ile web alaninizi düsürmek için girisimdebulunabilir Bunun için form nesneleriniz arasina dosya boyutunu sinirlaran <INPUT TYPE=’’hidden’’ NAME=’’MAX_FILE_SIZE’’ VALUE=’’500000’’> su satiri ekleyebilirsiniz
- Sitenize gelen saldirgan dosya gönderirken; dosyanin gönderilecegi dizini degistirerek sizin belirttiginiz klasör disina ulasabilir
- Mantik olarak bu gün çogu kisi tarafindan bilinen pek çok fikirlerden yaralanarak sitenize zarar vermemesi için en ince ayrintilara kadar düsünmek sizlerin görevidir