Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Sprawdzanie rozszerzenia
Forum PHP.pl > Forum > Przedszkole
Turson
Już nie wiem, czemu żadne sprawdzanie rozszerzenia pliku nie działa.

  1. <form enctype='multipart/form-data' action='upload.php' accept='image/jpeg,image/gif' method='POST'>

To nie działa..

  1. $allowed = array('gif', 'jpg', 'ico', 'bmp', 'jpeg', 'png');
  2.  
  3.  
  4. // sprawdzamy rozszerzenie
  5. if(in_array(strtolower($sp[1]), $allowed)) {

To działa, ale jak plik będzie się nazywał xxxx.jpg.php to wrzuca.
darko
Sprawdzaj typ mime przesłanego pliku (czy $_FILES['NAZWA']['type'] zawiera ciąg: 'images/'), dodatkowo - jeśli chcesz ograniczyć typy przesyłanych plików np. tylko do obrazków - możesz posłużyć się funkcją getimagesize. Ale i tak nigdy nie będzie pewności, ponieważ można te wszystkie zabiegi ominąć przy odpowiednim nakładzie pracy.
marlic
Podstawowe pytanie gdzie chcesz sprawdzać to rozszerzenie, po stronie klienta czy po stronie serwera?
  1. <form enctype='multipart/form-data' action='upload.php' accept='image/jpeg,image/gif' method='POST'>


accept w tym przypadku mówi przeglądarce jakie typy plików powinny być wysyłane na serwer i dobra przeglądarka internetowa na podstawie tej informacji powinna umożliwić wybór z lokalnego systemu tylko pliki o takim MIME

natomiast:
  1. $allowed = array('gif', 'jpg', 'ico', 'bmp', 'jpeg', 'png');
  2. // sprawdzamy rozszerzenie
  3. if(in_array(strtolower($sp[1]), $allowed)) { ...


to chyba jakieś delikatne nieporozumienie, niby co ma robić ten kod?
darko
Cytat(marlic @ 14.03.2010, 13:34:31 ) *
natomiast:
  1. $allowed = array('gif', 'jpg', 'ico', 'bmp', 'jpeg', 'png');
  2. // sprawdzamy rozszerzenie
  3. if(in_array(strtolower($sp[1]), $allowed)) { ...


to chyba jakieś delikatne nieporozumienie, niby co ma robić ten kod?

Sprawdzać czy rozszerzenie pliku, które znajduje się w $sp[1] jest w tablicy dozwolonych rozszerzeń winksmiley.jpg Ale właśnie TursoN wyprintuj sobie zawartość $sp[1] i upewnij się czy na pewno tam znajduje się rozszerzenie przesłanego pliku.
widmo17
Sprawdzanie mime, jak już gdzieś pisałem, to bardzo słaba opcja : d Najlepiej explode wg kropek po nazwie pliku, i odwołanie się do ostatniego elementu tablicy, którą zwróci owa funkcja
thek
Widmo... A żeś strzelił biggrin.gif poducha.exe.jpg winksmiley.jpg I właśnie na Twoim serwerze znajdować się może trojan bo byłeś idiotą i sprawdzałeś tylko ostatni element wpisany by zmylić. To jest jeszcze banalniejsze do zrobienia niż podmiana MIME, bo może to zrobić każdy zmieniając po prostu nazwę pliku. Poziom zabezpieczeń masz w tym momencie do obejścia przez kilkulatka winksmiley.jpg
Kshyhoo
I się zaczyna, nikt nie pisze konkretów, tylko robi polewę. A taki kod lepszy:?
  1. $sp = explode(".",$plik);
  2. $c_sp = count($sp) - 1;
  3. if ( $sp[$c_sp] == "gif"
  4. or $sp[$c_sp] == "jpg"
  5. or $sp[$c_sp] == "jpeg"
  6. or $sp[$c_sp] == "png"
  7. or $sp[$c_sp] == "rar"
  8. or $sp[$c_sp] == "zip"
  9. or $sp[$c_sp] == "pdf"
  10. or $sp[$c_sp] == "psd" ) {
  11. echo 'dobre';
  12. } else {
  13. echo 'złe';
  14. }

Choć na tablicy jeszcze lepiej...
mike
Cytat(Kshyhoo @ 14.03.2010, 18:52:24 ) *
A taki kod lepszy:?
Znacząco gorszy.
  1. <?php
  2.  
  3. $allowedExtensions = array('jpg', 'e.t.c.');
  4. $extension = end(explode('.', $file));
  5. if (in_array($extension, $allowedExtensions)) {
  6. // dobrze
  7. } else {
  8. // źle
  9. }
  10.  
  11. ?>
widmo17
thek: trojan w jpgu? Nie szkodzi snitch.gif Ciekawe jak ktoś mi go odpali na serwerze biggrin.gif
Kshyhoo
Cytat(mike @ 14.03.2010, 18:56:04 ) *
Znacząco gorszy.

A jak w nazwie będzie więcej kropek zadziała?
mike
Cytat(Kshyhoo @ 14.03.2010, 19:59:55 ) *
A jak w nazwie będzie więcej kropek zadziała?
To czy plik ma kropki czy nie to bez znaczenia, gorzej z rozszerzeniem.
Zadziała dla rozszerzeń bez kropek. Czyli dla .tar.gz będzie problem.
Turson
Cytat(mike @ 14.03.2010, 18:56:04 ) *
Znacząco gorszy.
  1. <?php
  2.  
  3. $allowedExtensions = array('jpg', 'e.t.c.');
  4. $extension = end(explode('.', $file));
  5. if (in_array($extension, $allowedExtensions)) {
  6. // dobrze
  7. } else {
  8. // źle
  9. }
  10.  
  11. ?>

Czyli ten jest bezpieczniejszy?
mike
Cytat(TursoN @ 14.03.2010, 20:35:19 ) *
Czyli ten jest bezpieczniejszy?
No pomyśl trochę. Czy jeden kod, który sprawdza rozszerzenie jest bezpieczniejszy od drugiego, który również sprawdza rozszerzenie?
Raczej nie. Chodzi o wygodę i względnie lepszy kod.

Jeśli interesuje Cię bezpieczeństwo to podejście do typu pliku powinno byc takie, że najpierw wstępnie weryfikujesz rozszerzenie a później sprawdzasz MIME.
Turson
Bezpieczniejszy pod względem, że nie przepuszcza plików, które w nazwie jedynie mają .jpg, np. plik.jpg.php
erix
Cytat
Nie szkodzi Ciekawe jak ktoś mi go odpali na serwerze

Normalnie. Wystarczy np. używać zbugowanych skryptów podatnych na LFI/RFI. W EXIF-ach dla JPEG można osadzać komentarze. I bez problemu także kod PHP. Binarna sieczka przed listingiem zostanie zignorowana, a kod backdoora zostanie wykonany.

Więc NAPRAWDĘ pewny upload =
  • sprawdzenie MIME po stronie SERWERA (ta zawarta w $_FILES pochodzi od przeglądarki; da się ominąć). Jak? Rozszerzenie mime_magic albo odpalenie polecenia file -bi plik i pobranie właściwego typu
  • przeszukanie pliku pod kątem kodu PHP
  • trzymanie plików poza katalogiem publicznym bądź kompletne wyłączenie interpretera w konkretnym katalogu


Dlaczego tak radykalnie? Pewnie ktoś pomyśli, że to na pewno się nie wydarzy? Niestety, miałem kiedyś coś takiego w skrypcie SMF (pisałem kiedyś na forum wątek na ten temat), w katalogu skryptu zaroiło się od trojanów w PHP, które prawdopodobnie miały za zadanie powysyłać trochę spamu i zainfekować inne serwery. Load - oczywiście - wzrósł.

A sprawdzanie rozszerzenia można kompletnie olać. winksmiley.jpg
lobopol
  1. $permittedFiles = array("jpg","png","gif","jpeg","doc","docx","txt","xls", "xlsx", "pdf");
  2. $ext = strtolower(substr($_FILES['Filedata']['name'],strrpos($_FILES['Filedata']['name'],'.')+1));
  3. if(in_array($ext,$permittedFiles)){
  4. move_uploaded_file($tempFile,$targetFile);
  5. }else die("Niedozwolony format pliku");

na podobnej zasadzie można mime sprawdzać
erix
A przeczytałeś mojego posta? winksmiley.jpg
darko
~erix
1. Czy jest jakaś równie dobra alternatywa dla mime_magic?
2. W jaki sposób można wyłączyć interpreter php w konkretnym katalogu?
widmo17
Cytat
zbugowanych skryptów podatnych na LFI/RFI

Tej opcji nie brałem pod uwagę, takie błędy raczej rzadko się zdarzają myślącym programistom snitch.gif
erix
Cytat
1. Czy jest jakaś równie dobra alternatywa dla mime_magic?

Jak napisałem - odpalenie polecenia systemowego file -bi plik i analiza zwróconej zawartości (konkretnie zwraca MIME).

Cytat
2. W jaki sposób można wyłączyć interpreter php w konkretnym katalogu?

Zależy od serwera. Ale na 90% wystarczy w htaccess http://httpd.apache.org/docs/1.3/mod/mod_m...l#removehandler dla MIME odpowiadającemu interpreterowi.

Cytat
Tej opcji nie brałem pod uwagę, takie błędy raczej rzadko się zdarzają myślącym programistom

Jeśli chodzi o zabezpieczenia, to skromność zawsze popłaca. winksmiley.jpg Poza tym, rzadko a nigdy, to jak pomyłka u sapera. winksmiley.jpg Pomyli się tylko raz. winksmiley.jpg
darko
Cytat(erix @ 15.03.2010, 21:36:54 ) *
Jak napisałem - odpalenie polecenia systemowego file -bi plik i analiza zwróconej zawartości (konkretnie zwraca MIME).


Zależy od serwera. Ale na 90% wystarczy w htaccess http://httpd.apache.org/docs/1.3/mod/mod_m...l#removehandler dla MIME odpowiadającemu interpreterowi.

Dzięki.
widmo17
Cytat
Jeśli chodzi o zabezpieczenia, to skromność zawsze popłaca. winksmiley.jpg Poza tym, rzadko a nigdy, to jak pomyłka u sapera. winksmiley.jpg Pomyli się tylko raz. winksmiley.jpg

Też prawda snitch.gif
Turson

  1. <?php
  2.  
  3. $allowedExtensions = array('jpg', 'e.t.c.');
  4. $extension = end(explode('.', $file));
  5. if (in_array($extension, $allowedExtensions)) {
  6. // dobrze
  7. } else {
  8. // źle
  9. }
  10.  
  11. ?>

[/quote]

Gdy mam ten skrypt,
} else {
echo "blaaaa!"
}

Wgrywając plik jpg wyskakuje ten błąd ^^
lobopol
Użyj tego tongue.gif jeżeli chodzi o samo sprawdzenie nazwy działa dobrze
  1. $permittedFiles = array("jpg","png","gif","jpeg","doc","docx","txt","xls", "xlsx", "pdf");
  2. $ext = strtolower(substr($_FILES['Filedata']['name'],strrpos($_FILES['Filedata']['name'],'.')+1));
  3. if(in_array($ext,$permittedFiles)){
  4. move_uploaded_file($tempFile,$targetFile);
  5. }else die("Niedozwolony format pliku");


Turson
Cytat(lobopol @ 16.03.2010, 16:41:41 ) *
Użyj tego tongue.gif jeżeli chodzi o samo sprawdzenie nazwy działa dobrze
  1. $permittedFiles = array("jpg","png","gif","jpeg","doc","docx","txt","xls", "xlsx", "pdf");
  2. $ext = strtolower(substr($_FILES['Filedata']['name'],strrpos($_FILES['Filedata']['name'],'.')+1));
  3. if(in_array($ext,$permittedFiles)){
  4. move_uploaded_file($tempFile,$targetFile);
  5. }else die("Niedozwolony format pliku");

Mógłby ktoś potwierdzić, czy będzie to dobre?
lobopol
Powiem w ten sposób to sprawdza tylko i wyłącznie końcówkę z nazwy pliku np aaaaaaa uzna za błędne, aaaaa.jpg uzna za poprawne (znajduję się w tablicy rozszerzenie), aaaa.php.jpg też uzna za poprawne, ale asdasd.jpg.php już nie.

To nie sprawdza mime pliku erix opisał jak to zrobić.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.