Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [PHP] Sprawdzanie rozszerzenia
Turson
post
Post #1





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
darko
post
Post #2





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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.

Ten post edytował darko 14.03.2010, 13:31:28
Go to the top of the page
+Quote Post
marlic
post
Post #3





Grupa: Zarejestrowani
Postów: 12
Pomógł: 2
Dołączył: 14.03.2010

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
darko
post
Post #4





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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ń (IMG:style_emoticons/default/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.
Go to the top of the page
+Quote Post
widmo17
post
Post #5





Grupa: Zarejestrowani
Postów: 24
Pomógł: 3
Dołączył: 17.03.2008
Skąd: niekąd

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
thek
post
Post #6





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Widmo... A żeś strzelił (IMG:style_emoticons/default/biggrin.gif) poducha.exe.jpg (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
Kshyhoo
post
Post #7





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




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...

Ten post edytował Kshyhoo 14.03.2010, 18:52:49
Go to the top of the page
+Quote Post
mike
post
Post #8





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
widmo17
post
Post #9





Grupa: Zarejestrowani
Postów: 24
Pomógł: 3
Dołączył: 17.03.2008
Skąd: niekąd

Ostrzeżenie: (0%)
-----


thek: trojan w jpgu? Nie szkodzi (IMG:style_emoticons/default/snitch.gif) Ciekawe jak ktoś mi go odpali na serwerze (IMG:style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
Kshyhoo
post
Post #10





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




Cytat(mike @ 14.03.2010, 18:56:04 ) *
Znacząco gorszy.

A jak w nazwie będzie więcej kropek zadziała?
Go to the top of the page
+Quote Post
mike
post
Post #11





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Turson
post
Post #12





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
mike
post
Post #13





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Turson
post
Post #14





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

Ostrzeżenie: (0%)
-----


Bezpieczniejszy pod względem, że nie przepuszcza plików, które w nazwie jedynie mają .jpg, np. plik.jpg.php
Go to the top of the page
+Quote Post
erix
post
Post #15





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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ć. (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
lobopol
post
Post #16





Grupa: Zarejestrowani
Postów: 1 729
Pomógł: 346
Dołączył: 4.04.2009

Ostrzeżenie: (0%)
-----


  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ć

Ten post edytował lobopol 14.03.2010, 22:41:46
Go to the top of the page
+Quote Post
erix
post
Post #17





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




A przeczytałeś mojego posta? (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
darko
post
Post #18





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


~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?
Go to the top of the page
+Quote Post
widmo17
post
Post #19





Grupa: Zarejestrowani
Postów: 24
Pomógł: 3
Dołączył: 17.03.2008
Skąd: niekąd

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/snitch.gif)
Go to the top of the page
+Quote Post
erix
post
Post #20





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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. (IMG:style_emoticons/default/winksmiley.jpg) Poza tym, rzadko a nigdy, to jak pomyłka u sapera. (IMG:style_emoticons/default/winksmiley.jpg) Pomyli się tylko raz. (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 21:32