lostyazilim
tr.link

Dosya uzantısını alma explodesiz? (Çözüldü)

15 Mesajlar 2.737 Okunma
lstbozum
tr.link

0ktay 0ktay strdex Kullanıcı
  • Üyelik 01.02.2018
  • Yaş/Cinsiyet 26 / E
  • Meslek Yazılım öğrencisi
  • Konum Antalya
  • Ad Soyad O** Ş**
  • Mesajlar 603
  • Beğeniler 25 / 155
  • Ticaret 2, (%100)
Merhabalar,

Eminim bu sorun çoğu kişinin kafasındadır.
Soru şöyle;
Yüklenen dosyanın uzantısını nasıl alabiliriz?
Arkadaşlar aslında dosya uzantısını explode ile gelen isimi 2 ye bölerek alabiliyorum ama hacklenmeyi engellemek açısından dosya adını 2 ye bölmeden sonundaki noktadan sonrasını nasıl alabilirim (explodesiz veya explodeli) ?

Yani sonuç olarak kötü niyetli bir kullanıcı gelip dosya.jpg.exe adında bir dosya yükleyip kullandığım if ($dosyaAdi == "jpg") yapıyı basit bir şekilde aşabilir.
Ancak sonuncu noktadan sonrasını alırsam bu durumdan kurtulabilirim diye düşünüyorum.

Şimdiden yardım eden herkeze çok teşekkürler.
 

 

Eğitimin pahalı olduğunu düşünüyorsanız, cehaletin bedelini hesaplayın.
wmaraci
reklam

65116 65116 WM Aracı Anonim Üyelik
  • Üyelik 20.06.2016
  • Yaş/Cinsiyet - /
  • Meslek
  • Konum
  • Ad Soyad ** **
  • Mesajlar 632
  • Beğeniler 0 / 196
  • Ticaret 9, (%89)
0ktay
preg_match ile yapılabilir doğru anladıysam konunu..


$degisken = "dosya.jpg.exe";
preg_match("/dosya(.*)/s", $degisken, $genx);
echo $genx[1];


Kolaylıklar

EDİT: daha tatlı olması adına:


$degisken = "dosya.jpg.exe";
preg_match("/dosya(.*)/s", $degisken, $genx);
$cikti = $genx[1];
echo $cikti;
 

 

0ktay 0ktay strdex Kullanıcı
  • Üyelik 01.02.2018
  • Yaş/Cinsiyet 26 / E
  • Meslek Yazılım öğrencisi
  • Konum Antalya
  • Ad Soyad O** Ş**
  • Mesajlar 603
  • Beğeniler 25 / 155
  • Ticaret 2, (%100)
Güven ilk olarak cevabınız için çok teşekkürler.

Siz dosyaismi.'dan sonrasını veriyorsunuz ben dosyaismi.jpg.exe.png olanı istiyorum yani en sonuncu . dan sonraki uzantıyı istiyorum.
 

 

Eğitimin pahalı olduğunu düşünüyorsanız, cehaletin bedelini hesaplayın.

65116 65116 WM Aracı Anonim Üyelik
  • Üyelik 20.06.2016
  • Yaş/Cinsiyet - /
  • Meslek
  • Konum
  • Ad Soyad ** **
  • Mesajlar 632
  • Beğeniler 0 / 196
  • Ticaret 9, (%89)
0ktay


$degisken = "dosya.png";
preg_match("/dosya(.*)/s", $degisken, $genx);
$cikti = $genx[1];
echo $cikti;


bumudur. yada sen dosya. ya png mi EKLEMEK istiyorsun
 

 

wmaraci
wmaraci

65116 65116 WM Aracı Anonim Üyelik
  • Üyelik 20.06.2016
  • Yaş/Cinsiyet - /
  • Meslek
  • Konum
  • Ad Soyad ** **
  • Mesajlar 632
  • Beğeniler 0 / 196
  • Ticaret 9, (%89)
0ktay


echo preg_replace('/(\.exe)/', '$1.png', "dosyaismi.jpg.exe");


artık hangisini anladıysam
 

 

0ktay 0ktay strdex Kullanıcı
  • Üyelik 01.02.2018
  • Yaş/Cinsiyet 26 / E
  • Meslek Yazılım öğrencisi
  • Konum Antalya
  • Ad Soyad O** Ş**
  • Mesajlar 603
  • Beğeniler 25 / 155
  • Ticaret 2, (%100)
Güven Dostum ben kendimi ifade edemedin sanırım.

Ben zaten senin bana sağladığın .dan sonrasını explode ile alıyorum sorunum o değil!

Sorunum kullanıcı örneğin; dosya.ismi.png şeklinde bir dosya ismi verirse senin yönteminle (.*) ile ismi.png kısmını almış olacağız.
Benim dosya uzantı kontol yapımda if ($dosyaAdi == "png") sürekli hata döndürecek.

Benim istediğim kullanıcı dosya adında nekadar çok nokta kullanırsa kullansın bana sonuncu nokta'dan sonrasını versin.

Örn: Kullanıcıdan gelen dosya adı dosya.rar.zip.exe.png şeklinde diyelim ve burada 4 tane nokta kullanılmış bana 4. noktadan sonrasını versin. not : (kullanıcı istediğin kadar nokta kullanabilir 4'ü örnek olarak söyledim :) )
 

 

Eğitimin pahalı olduğunu düşünüyorsanız, cehaletin bedelini hesaplayın.

65116 65116 WM Aracı Anonim Üyelik
  • Üyelik 20.06.2016
  • Yaş/Cinsiyet - /
  • Meslek
  • Konum
  • Ad Soyad ** **
  • Mesajlar 632
  • Beğeniler 0 / 196
  • Ticaret 9, (%89)
0ktay

$degisken = "asd.exe.png";
$sinirla = explode('.', $degisken);
$sinirla = $sinirla[count($sinirla)-1];
echo $sinirla;


al bakalım kullanıcı ne kullanırsa kullansın ne kadar nokta atarsa atsın son noktadan sonrasını "png" döndürür
Since1912

kişi bu mesajı beğendi.

0ktay 0ktay strdex Kullanıcı
  • Üyelik 01.02.2018
  • Yaş/Cinsiyet 26 / E
  • Meslek Yazılım öğrencisi
  • Konum Antalya
  • Ad Soyad O** Ş**
  • Mesajlar 603
  • Beğeniler 25 / 155
  • Ticaret 2, (%100)
Güven Çok teşekkürler aradığım buydu.

bende count ile saydırmayı denedim ama sonuncu değeri nasıl alacağımı bilmiyordum güzel yolmuş :)
 

 

Eğitimin pahalı olduğunu düşünüyorsanız, cehaletin bedelini hesaplayın.

65116 65116 WM Aracı Anonim Üyelik
  • Üyelik 20.06.2016
  • Yaş/Cinsiyet - /
  • Meslek
  • Konum
  • Ad Soyad ** **
  • Mesajlar 632
  • Beğeniler 0 / 196
  • Ticaret 9, (%89)
0ktay

ayrıca


$degisken = "dosya.exe.jpg.png";
preg_match("/\.(png)$/", $degisken, $sinirla);
echo $sinirla[1];



yaparsan sonunu yakalar explode ye alternatiftir..

tüm resim formatlarını yakalamak icin

preg_match("/\.(gif|png|bmp|jpe?g)$/", $degisken, $sinirla);


şeklinde düzenleyebilirsin.. preg_match daha sempatiktir. kod fazlalıgından kurtulursun iyi calısmalar
 

 

Decimas Decimas WM Aracı Kullanıcı
  • Üyelik 19.04.2015
  • Yaş/Cinsiyet 26 / E
  • Meslek Developer
  • Konum İstanbul Avrupa
  • Ad Soyad E** E**
  • Mesajlar 820
  • Beğeniler 1 / 302
  • Ticaret 1, (%100)
Regex ile dosya uzantısı mı kontrol ediyorsun, bu zamanda kimse direkt çalıştırılabilir bir dosya yüklemez :D virüs.jpg ama arkaplanda virüs.php gömülü olabilir, resim çağrıldığı an puff. PHP'de bu tip durumları daha derinden mime type denen kavrama yaklaşarak çözmek gerek. Extension değil dosya içeriği, formatı önemli. Örneğin şu küçük kütüphane güzel bir örnek.

Eskiden kullandığım ufak bir fonksiyon, örrnek olması amacıyla bırakayım.


public function imageUpload(){
$query = $this->db->prepare("SELECT * FROM limits WHERE id=1");
$query->execute(array());
$limits != null ? $query->fetch(PDO::FETCH_ASSOC) : 7;

$image = new Bulletproof\Image($_FILES);
$upname = $image->getName();
$svname = hash('sha512', date("d-m-Y H:i:s", time())).rand(222, 222222);

preg_match_all('/[0-9]+/', $limits['max_up_file_resolution'], $matches, PREG_SET_ORDER);
$maxwidth = $matches[0][0];
$maxheight = $matches[1][0];

$image->setName($svname)
->setLocation(__DIR__ . "/../../uploads")
->setMime(array('png', 'jpg', 'jpeg', 'gif'))
->setDimension($maxwidth, $maxheight)
->setSize('1', $limits['max_up_file_size']);

if($image["pictures"]){
if($image->upload()){
$query = $this->db->prepare("INSERT uploads SET userid=:userid, date=:date, ip=:ip, upname=:upname, svname=:svname, ext=:ext, size=:size, resolution=:resolution");
$addvalue = $query->execute(array(
"userid" => $this->common->post('userid'),
"date" => date("d-m-Y H:i:s", time()),
"ip" => $this->getIP(),
"upname" => $upname,
"svname" => $svname,
"ext" => $image->getMime(),
"size" => $image->getSize(),
"resolution" => $image->getWidth().'x'.$image->getHeight()
));

if ($addvalue)
return true;
else
return false;
} else{
return $image["error"];
}
}
}


Görüldüğü üzere dosya ismi değiştirilmesi önemli, en azından saldırgan sonraki adımı resmin yeni ismini öğrenmek olacaktır. Biraz terletmek için.

Resimlerin yüklendiği veya kullanıldığı klasörler için .htaccess ile belirli sınırlamalar getirilmeli, çalıştırılabilir dosyalara izin verilmemeli, mesela PHP veya flash içerikli dosyalar.
 

 

no time for caution
wmaraci
wmaraci
Konuyu toplam 1 kişi okuyor. (0 kullanıcı ve 1 misafir)
Site Ayarları
  • Tema Seçeneği
  • Site Sesleri
  • Bildirimler
  • Özel Mesaj Al