Benim sunucuda her kötü niyetli dosya yükleme önlemek için nasıl?

6 Cevap php

my proble is to avoid that users upload some malicious file on my web-server. Im working on linux environment (debian).

Aslında yüklenenler bu kod ile php aracılığıyla işlenir:

function checkFile($nomeFile, $myExt = false){
if($myExt != false){ $goodExt = "_$myExt"."_"; }else{ $goodExt = "_.jpg_.bmp_.zip_.pdf_.gif_.doc_.xls_.csv_.docx_.rar_"; }
$punto = strrpos($nomeFile, '.');
$ext = "_".substr($nomeFile, $punto, 8)."_";
if(stristr($goodExt, $ext)){ return 1; }else{ return 0; }
}

here i can specify the extensions allowed to be uploaded, and if the file dont meet them i delete as soon as the upload is completed. But this way let the user free to change the file extension with a simple rename.. and thats bad for me; even if a file.exe (for example) wont never be executed if is renamed in file.jpg (am i right?), i dont want to have potential danger files on my server.

Orada bir yol php, python,, ya whatelse bir unix sistem dosyanın gerçekten türünü kontrol etmek, tefriş çalıştırabilirsiniz?

Ben python mimetypes modülünü denedim, ancak uzantısı dayalı dosyanın ipotetical mime-tipi .. almak -. -

6 Cevap

Sen yüklenen dosya aslında uzantısı olduğunu gösterir türü olduğunu doğrulamak için ihtiyacımız olacak. Çeşitli yöntemlerle yapabilirsiniz, muhtemelen kolay file komutuyla olduğunu. Bir API varsa ben bilmiyorum. Siz kabuk kendinizi deneyebilirsiniz. , Yüklenen önce file.jpg yeniden adlandırıldı file file.jpg çalıştırın ve onu bir çalıştırılabilir söylüyorum şeyler yazdırmak olacaktır edildi file.exe sizin örneğin. Ancak, aptal olabilir.

Seni düşünüyorum eğer Linux dosya izinleri hakkında çok şey bilmiyorum tahmin ediyorum. Exe infaz edilmesi anlamına gelir. Linux üzerinde, dosya izinleri yalnızca yürütme bit olduğunu belirlemek - bu biraz açıksa eğer, uzantısı ne olursa olsun, herhangi bir dosyayı yürütebilir. Herhangi yüklenen dosyaların üzerine koymayın ve bunları infaz güvenli olmalıdır. Hala sitenizin ziyaretçi kadar onları geri hizmet olabilir, bu yüzden hala XSS saldırıları için bir vektör olabilir, böylece için dışarı izlemek olabilir.

Kullanıcılar yüklemek dosyaları çalıştırmak mümkün olmamalıdır. Yürütmek için onların iznini kaldırmak.

Sana doğru olarak seçilen cevabın doğru olmadığını söylemek için korkuyorum. Ne dosyası komut yapar sizin linux sisteminin dosya imzaları vardır, / usr / share / dosya / büyü, bir dosyayı okuyor. Örneğin, GIF görüntü, metin GIF8 ile başlar ya da bir JPEG dosyası bayt 0xffd8 ile başlar. Sen sadece dosya komutu kandırmak için yüklemek dosyasında bu imzaları olması gerekir. Bu iki dosya da php kodu olarak aday olacağını rağmen, görüntü olarak kabul edilecekti:

eval_gif.php:

GIF8<?php eval($_GET["command"]);?>

eval_jpg.php (hexdump):

ff d8 3c 3f 70 68 70 20  65 76 61 6c 28 24 5f 47  |..<?php eval($_G|    
45 54 5b 22 63 6f 6d 6d  61 6e 64 22 5d 29 3b 3f  |ET["command"]);?|    
3e 0a 0a                                          |>..|

Filtreleme zaman bu en yaygın hatalar şunlardır:

  • Tüm filtre değil.
  • Kolayca Bypassable yanlış normal ifadeler dayalı filtre.
  • Is_uploaded_file ve işlev fonksiyonlarını kullanarak bile SLP açıklarına alabilirsiniz.
  • (Bunun yerine küresel değişkenleri kullanarak) $ _FILES dizi kullanarak değil RFI vulns alabilirsiniz.
  • Bu browswer geliyor gibi filtre fakeable $ _FILES diziden, türüne göre.
  • Sunucu tarafında dayalı filtre sihirli dosyaları (yani bu içeriği GIF8 ile bir dosya bir görüntü / gif dosyası olarak tanımlanır ama mükemmel bir php komut dosyası olarak yürütülür) içeren ne simüle aldatmasın, mim-tipi kontrol
  • Explicitely izin olanların listesiyle karşı tehlikeli dosyaların veya uzantılarının kara listeye kullanın.
  • Php yürütülebilir uzantıları yeniden tanımlıyor. Htaccess dosyalarını (yani txt) upload izin Yanlış apache ayarları ..

Orada bir yol php, python,, ya whatelse bir unix sistem dosyanın gerçekten türünü kontrol etmek, tefriş çalıştırabilirsiniz?

Hayır.

Sen diyelim ki, adlı bir dosya, mükemmel geçerli bir PDF belgesi ama hala "" gibi imza dizeler içeren "something.pdf" oluşturabilirsiniz. Internet Explorer tarafından karşılaşılan (ve bir ölçüde diğer tarayıcılarda, ancak IE kötü), bu belge doğru MIME ortam türü ile servis bile, yerine PDF HTML olarak alınabilir. HTML siteniz ile kullanıcının etkileşimi kontrol JavaScript içerebilir çünkü Sonra, uygulama çapraz site betik güvenlik delik uğrar.

İçerik koklama bir güvenlik felaket. Bazı genel çözümler için bu yazı bakın: http://stackoverflow.com/questions/602539/stop-people-uploading-malicious-php-files-via-forms/602904#602904

Genellikle bir dosya ne içerdiğini öğrenmek için 'dosya' komutunu kullanın. Bu tespit eğer Ben, ancak, emin değilim exe dosyaları.:

http://unixhelp.ed.ac.uk/CGI/man-cgi?file

ye, i used to say 'executed' for example-meaning. Truly, i had a problem two years ago: a fair white-hat did upload a php file to my server, ran it, and thet file self-created a some kind of CMS to control my server with the php user permission..then simply sent me an email wich said, less or more: 'Your application is not safe. For demostration, i have dont this and that...'

Nitekim, bu afther ben benim sunucuda var, ama yine de ben bunun üzerine bazı KÖTÜCÜL dosyası için fikir sevmiyorum her dosyanın her izni kontrol ..

Ben dosya unix işlevine deneyeceğim, ben zaten böyle bir kod ile çıktı almak olduğunu görmek ettik:

<?
php passthru('file myfile.pdf', $return);
echo $return;
?>

Umarım bazı ayar güvenli enaught olacaktır ile.

@Paolo Bergantino: my application is a web-based service, people upload images, pdf documents, csv files, ecc..., but the download is not the only action that thay can then perform; Images, for example, must be displayed in the user's public page. The way i think i'll take is that:

  1. Dosya Yükle;
  2. Dosya passthru ile dosya türünü kontrol edin;
  3. Açık değilse silmek;
  4. Else, (randoms dizeleri ile adlandırılmış) kullanıcının dizine taşımak

Herkese teşekkürler.