Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Bezpieczne wysyłanie obrazów na serwer, Szczególnie awatarów i zdjęć
WebCM
post
Post #1





Grupa: Zarejestrowani
Postów: 375
Pomógł: 20
Dołączył: 28.07.2006

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


Jak bezpiecznie załadować plik graficzny na serwer, aby rzeczywiście był plikiem PNG, JPG lub GIF i nie zawierał szkodliwego kodu?

getimagesize()
Wymagania: GD
Nie chroni przed: wrzuceniem kodu PHP do obrazu (wciąż wykrywa typ: image/*)

mime_content_type()
Czy funkcja zawsze poprawnie wykrywa typ MIME pliku (NIE na podstawie rozszerzenia)? Czy jest wystarczającym zabezpieczeniem? W podręczniku PHP jest napisane, że funkcja ma status "deprecated" i odsyłają do rozszerzenia Fileinfo z PECL - wątpię, żeby było dostępne na większości serwerów, szczególnie darmowych, gdyż trzeba je doinstalować.

$_FILES['type']
Tak, to naiwna metoda, gdyż typ jest wysyłany przez przeglądarkę.

Pole MAX_FILE_SIZE
Do czego właściwie przydaje się to pole? Zabezpieczenie nie chroni przed userami, którzy zwiększą wartość tego pola.

Wniosek?
Których zabezpieczeń wystarczy użyć, aby mieć pewność, że na serwer zostanie wysłany rzeczywiście plik PNG, JPG lub GIF?


--------------------
„Jesteśmy różni, pochodzimy z różnych stron Polski, mamy różne zainteresowania, ale łączy nas jeden cel. Cel ten to Ojczyna, dla której chcemy żyć i pracować.” Roman Dmowski
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 16)
bregovic
post
Post #2





Grupa: Zarejestrowani
Postów: 562
Pomógł: 15
Dołączył: 8.08.2003
Skąd: Denmark/Odense

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


Hmm, że tak się zapytam z poza pudełka, a nawet jeśli ktoś wyśle ci kod PHP z rozszerzeniem .jpg (or anything else) to przecież i tak ten kod się nie wykona - chyba że twój serwer parsuje pliki graficzne jako PHP, lub include'ujesz pliki graficzne w twoim kodzie. Mylę się? Poza tym, AFAIK, nie ma definitywnej możliwości sprawdzenia typu pliku, poza parsowaniem tegoż.

Ten post edytował bregovic 4.11.2008, 20:35:20


--------------------
Prank - for the fun. Mac - for the simplicity. Deviantart - for the kick.
Life is ours, We live it our way -- Metallica
Go to the top of the page
+Quote Post
danek
post
Post #3





Grupa: Zarejestrowani
Postów: 48
Pomógł: 1
Dołączył: 1.02.2004
Skąd: warszawa

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


Mój pomysł (z podkreśleniem pomysł):
1.Odpalić skrypt resize-ujący (np generujący miniaturki)
2. Jeżeli wywali błąd to to nie jest poprawny imidż, a jeżeli nie, to można założyć, że to poprawny imidż.
Ew. 3. Zresizować do podobnych wymiarów i porównać rozmiar (wagę) obu danych. Jeżeli normalny obrazek to wymiary będą podobne, a jeżeli jakiś kod to po przetworzeniu będzie o wiele mniejsze (pewnie jakiś string z błędem)


--------------------
E-Danek.info
Go to the top of the page
+Quote Post
pyro
post
Post #4





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


sprawdzac rozszerzenie i mime pliku PRZY CZYM trzeba wylaczyc opcję HTTP PUT w serwerze (w apache'u jest ona domyslnie wylaczona), z kolei w ISS w niktorych wersjach jest wlaczona ta opcja i trzeba ją ręcznie wylaczyc


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
Pilsener
post
Post #5





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


Sposób stary jak świat: wczytać kilka pierwszych i ostatnich bajtów z pliku by zobaczyć, co zawiera. Użyć biblioteki GD i wykonać jakąś operację na obrazku - jeśli będzie poprawna, to obrazek jest ok.
Go to the top of the page
+Quote Post
pyro
post
Post #6





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


Cytat(Pilsener @ 5.11.2008, 13:35:17 ) *
Sposób stary jak świat: wczytać kilka pierwszych i ostatnich bajtów z pliku by zobaczyć, co zawiera. Użyć biblioteki GD i wykonać jakąś operację na obrazku - jeśli będzie poprawna, to obrazek jest ok.


... i właśnie przez takie myślenie dużo stron jest podatnych na ataki

Ten post edytował pyro 5.11.2008, 14:07:40


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
bim2
post
Post #7





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

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


@pyro
Jak już tak mówisz, to może wyjaśnić jak zrobić to dobrze smile.gif


--------------------
Go to the top of the page
+Quote Post
pyro
post
Post #8





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


bim2, juz napisalem, patrz wyzej.

Napewno to nie jest bezpieczne jesli zrobi sie tak jak powiedzial Pilsener


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
MMX3
post
Post #9





Grupa: Zarejestrowani
Postów: 155
Pomógł: 9
Dołączył: 26.01.2004
Skąd: Poznań

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


boże dzieci się flejmują o bezpieczeństwie. Prawda jest jedna. Zabezpieczyć się można tylko przed ludźmi którzy chcą ale nie potrafią się włamać. A ci co chcą i potrafią plus mają dość determinacji napewno obejdą. A co do samego tematu to exploit na GD to dla mnie coś nowego. Pierwszy resize powie że pomimo dobrego headera pliku wewnątrz jest kaszana.


--------------------
Go to the top of the page
+Quote Post
WebCM
post
Post #10





Grupa: Zarejestrowani
Postów: 375
Pomógł: 20
Dołączył: 28.07.2006

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


MMX: A jeśli nie chcę zmniejszać obrazu?

Na razie sprawdzam rozszerzenie pliku oraz wywołuję getimagesize(), aby sprawdzić, czy szerokość jest większa od 0, a wymiary mniejsze od maksymalnych ustawionych w konfiguracji. Do tego move_uploaded_file().

Czy to wystarczy?


--------------------
„Jesteśmy różni, pochodzimy z różnych stron Polski, mamy różne zainteresowania, ale łączy nas jeden cel. Cel ten to Ojczyna, dla której chcemy żyć i pracować.” Roman Dmowski
Go to the top of the page
+Quote Post
Riklaunim
post
Post #11





Grupa: Zarejestrowani
Postów: 640
Pomógł: 44
Dołączył: 8.02.2004

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


Cytat(WebCM @ 6.11.2008, 15:39:05 ) *
MMX: A jeśli nie chcę zmniejszać obrazu?

Na razie sprawdzam rozszerzenie pliku oraz wywołuję getimagesize(), aby sprawdzić, czy szerokość jest większa od 0, a wymiary mniejsze od maksymalnych ustawionych w konfiguracji. Do tego move_uploaded_file().

Czy to wystarczy?


Tak winksmiley.jpg

Plus jeżeli zachowujesz oryginalną nazwę pliku to sprawdź czy nie zawiera HTML smile.gif


--------------------
Biblioteki: Skrypty, CMS | Kurs PHP | Python
Go to the top of the page
+Quote Post
WebCM
post
Post #12





Grupa: Zarejestrowani
Postów: 375
Pomógł: 20
Dołączył: 28.07.2006

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


Teoretycznie nazwa pliku nie może zawierać znaków: <, >, ", ?... Przynajmniej w systemie Windows. Czy jest więc zagrożenie, że nazwa pliku będzie zawierać HTML lub przełamie znacznik <img>?

Ten post edytował WebCM 6.11.2008, 14:35:25


--------------------
„Jesteśmy różni, pochodzimy z różnych stron Polski, mamy różne zainteresowania, ale łączy nas jeden cel. Cel ten to Ojczyna, dla której chcemy żyć i pracować.” Roman Dmowski
Go to the top of the page
+Quote Post
pyro
post
Post #13





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


Cytat(MMX3 @ 6.11.2008, 11:31:55 ) *
boże dzieci się flejmują o bezpieczeństwie. Prawda jest jedna. Zabezpieczyć się można tylko przed ludźmi którzy chcą ale nie potrafią się włamać. A ci co chcą i potrafią plus mają dość determinacji napewno obejdą. A co do samego tematu to exploit na GD to dla mnie coś nowego. Pierwszy resize powie że pomimo dobrego headera pliku wewnątrz jest kaszana.


Tak oczywiście, to wogóle nic nie zabezpieczajmy i dajmy kazdemu wejsc do systemu, gratuluje "intieligęcji" MMX3


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
Riklaunim
post
Post #14





Grupa: Zarejestrowani
Postów: 640
Pomógł: 44
Dołączył: 8.02.2004

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


Cytat(WebCM @ 6.11.2008, 16:32:52 ) *
Teoretycznie nazwa pliku nie może zawierać znaków: <, >, ", ?... Przynajmniej w systemie Windows. Czy jest więc zagrożenie, że nazwa pliku będzie zawierać HTML lub przełamie znacznik <img>?

Pod uniksami można w nazwie pliku wpisać różne znaki winksmiley.jpg Najlepiej będzie jak będziesz generował własną nazwę z time() (unikając zarazem nadpisywania plików o tej samej nazwie).

Ten post edytował Riklaunim 6.11.2008, 15:42:05


--------------------
Biblioteki: Skrypty, CMS | Kurs PHP | Python
Go to the top of the page
+Quote Post
l0ud
post
Post #15





Grupa: Zarejestrowani
Postów: 1 387
Pomógł: 273
Dołączył: 18.02.2008

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


Prawda jest taka, że wystarczy kontrola nagłówka obrazka, zapisanie go pod właściwym rozszerzeniem - oczywiście pod warunkiem, że nie ma innych dziur, np. pozwalających na include dowolnego obrazka. Nawet jeżeli plik jpeg nie będzie poprawny, to co z tego? Nikt się przez to nie włamie...


--------------------
XMPP: l0ud@chrome.pl
Go to the top of the page
+Quote Post
pyro
post
Post #16





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


Cytat(l0ud @ 6.11.2008, 21:46:41 ) *
Prawda jest taka, że wystarczy kontrola nagłówka obrazka, zapisanie go pod właściwym rozszerzeniem - oczywiście pod warunkiem, że nie ma innych dziur, np. pozwalających na include dowolnego obrazka. Nawet jeżeli plik jpeg nie będzie poprawny, to co z tego? Nikt się przez to nie włamie...


.. i jest to dobre rozwiązanie, jednak co, jesli ktos chce zapisac plik o nazwie jaką on miał? smile.gif wtedy patrz nad ktorys z moich postow wyzej tongue.gif


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
l0ud
post
Post #17





Grupa: Zarejestrowani
Postów: 1 387
Pomógł: 273
Dołączył: 18.02.2008

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


No dokładnie, nazwa powinna być unikalna winksmiley.jpg Najlepiej na podstawie analizy nagłówka / funkcji getimagesize rozpoznać typ obrazka i na jego podstawie dodać rozszerzenie, do unikalnej, wygenerowanej nazwy pliku.


--------------------
XMPP: l0ud@chrome.pl
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 19.08.2025 - 20:30