Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [HTML][JavaScript][PHP]Skrypt w obrazku. Jak się zabezpieczyć?
qrzysztof
post
Post #1





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

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


Na stronie użytkownik może wgrywać obrazki z sieci (poprzez podanie adresu url obrazka).

Jak się zabezpieczyć przed wstrzyknięciem wrogiego kodu? Wiadomo, że użytkownik może zmienić rozszerzenie pliku na na przykład .jpg. W ten sposób omija już walidację. Można sprawdzić MIME, tyle że MIME też jest podobno nietrudne do podrobienia.

Zainspirował mnie ten artykuł. Wynika z niego, że MIME można sfałszować, i że doprowadzić to może do wykonania kodu w IE.


--------------------
Znalazłeś sam rozwiązanie swojego problemu? Nie pisz "już wiem, do zamknięcia". Podziel się rozwiązaniem - inni będą mieli łatwiej.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 14)
Spawnm
post
Post #2





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




Np. zapisuj przez GD robiąc kopie smile.gif
Go to the top of the page
+Quote Post
qrzysztof
post
Post #3





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

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


Co przez to zyskuję?

A jeśli nie robię kopii?

Chodziło mi o to czy jest możliwa taka sytuacja, że z kodu:

  1. <img src="www.obrazki.pl/przyjazny_obrazek.jpg" width="10" height="10" />


zrobi się o wczytaniu obrazka:

  1. <img src="podstawiony_obrazek1.jpg">
  2. <script type="text/javascript">złośliwy skrypt</script>
  3. <img="podstawiony_obrazek2.jpg" width="10" height="10" />


Nie wiem jak się robi takie ataki. Ale mi się z czymś takim to skojarzyło.

Bo przed podaniem takiego url:

  1. www.obrazki.pl/obrazek.jpg" onload="zlosliwy_kod();


jestem się w stanie zabezpieczyć. Ale jeśli w pliku obrazek.jpg może się kryć skrypt i zostanie on wykonany przy wczytaniu obrazka to nie mam pojęcia jak temu zapobiec.


--------------------
Znalazłeś sam rozwiązanie swojego problemu? Nie pisz "już wiem, do zamknięcia". Podziel się rozwiązaniem - inni będą mieli łatwiej.
Go to the top of the page
+Quote Post
bolverk
post
Post #4





Grupa: Zarejestrowani
Postów: 57
Pomógł: 6
Dołączył: 10.08.2009
Skąd: Nowe Miasto Lubawskie

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


Ja w swoim skrypcie walidacji textarea mam mniej więcej tak:

  1. $tag_invalid = array('<script', '</script');
  2.  
  3. //ochrona przed niodpowiednimi znacznikami
  4. //zmienna $text to łańcuch znaków do walidacji
  5. for($i=0; $i<count($tag_invalid); $i++)
  6. {
  7.  
  8. if(stristr($text, $tag_invalid[$i]))
  9. {
  10. error = "Użyte niedozwolone znaczniki.";
  11. return 0;//bład
  12. }
  13. }


i nie ma problemu ze znacznikami <script i </script


--------------------
Użytkownicy jak życie, wszystkim mogą cię zaskoczyć.
Go to the top of the page
+Quote Post
qrzysztof
post
Post #5





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

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


Tu jest trochę inna sytuacja.

Z tym co wpisują ludzie w formularzu można sobie poradzić (na przykład tak, jak podałeś).

Problem pojawia się z obrazkiem, którego zawartość jest w 100% pod kontrolą użytkowników. Jego też by trzeba skanować pod kątem znaczników? A może jednak nie ma takiej potrzeby? Z lekką rezerwą podchodzę do tego artykułu z pierwszego posta. A że nie mam wiedzy, jak taki atak mógłby wyglądać (można umieścić w obrazku cokolwiek i zostanie to wykonane? czy może są istotne ograniczenia?) to tym bardziej nie mam pojęcia jak się przed nim zabezpieczyć.

Kolejny link.

Dobrze, że jest świadomość problemu. Jeszcze rozwiązanie by się przydało.

Ten post edytował qrzysztof 13.11.2009, 21:58:25


--------------------
Znalazłeś sam rozwiązanie swojego problemu? Nie pisz "już wiem, do zamknięcia". Podziel się rozwiązaniem - inni będą mieli łatwiej.
Go to the top of the page
+Quote Post
bolverk
post
Post #6





Grupa: Zarejestrowani
Postów: 57
Pomógł: 6
Dołączył: 10.08.2009
Skąd: Nowe Miasto Lubawskie

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


Może wtedy otwórz ten plik funkcja fopen() i zbadaj jego zawartosć na niepożadane znaczniki.

//EDIT
Tzn. najpierw sciagnij ten plik na serwer, zbadaj jego zawartosć, wyrzucajac go potem można dać odpowiedni komunikat o błędzie lub zamiescić go bezpiecznie w znaczniku <img>. I ja chyba cos takiego zaimplementuję bo mnie trochę zmartwiłes i zainspirowałes smile.gif

Ten post edytował bolverk 13.11.2009, 22:18:18


--------------------
Użytkownicy jak życie, wszystkim mogą cię zaskoczyć.
Go to the top of the page
+Quote Post
erix
post
Post #7





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




Cytat
Problem pojawia się z obrazkiem, którego zawartość jest w 100% pod kontrolą użytkowników. Jego też by trzeba skanować pod kątem znaczników?

Tak.

A najprościej się od tego uwolnić odpalając któreś narzędzie z pakietu ImageMagick z parametrem --strip. Wycina on wszystkie metadane i komentarze w pliku graficznym.

Co do praktycznego wykorzystania tego ataku - SimpleMachines Forum było w wersji bodajże 1.1.8 podatne na pobieranie zainfekowanego avatara z zewnątrz. Sprawdzane były tylko uploadowane. Czym to się kończyło? Skrypty stały się botami do rozsyłania spamu. Nieraz do tego stopnia, że load serwera wzrastał do dramatycznych rozmiarów.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
qrzysztof
post
Post #8





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

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


Dzięki erix. To dużo wyjaśnia. Nurtuje mnie jeszcze jedna kwestia.

Założenie mam takie, że nie robię kopii na serwerze. W tym momencie musiałbym sprawdzać plik nie tylko przy uploadzie ale przy każdym żądaniu wyświetlenia (ze względu na możliwość podmiany). Ta opcja z oczywistych względów odpada.

Rozsądniejsze rozwiązanie to chyba umieszczenie w bazie oprócz adresu jakiegoś drugiego istotnego atrybutu. Najlepiej jakiejś sumy kontrolnej czy daty modyfikacji. Widzę, że w get_headers na pozycji 4 jest ETag. Jeśli plik będzie podmieniony to będzie on inny i w wyniku porównania z analogiczną pozycją w bazie zostanie zgłoszony błąd. Dzięki temu pliki mogłyby być sprawdzane tylko raz - przy dodawaniu.

Proszę tylko o potwierdzenie jeśli dobrze rozumuję lub o uwagi jeśli nie do końca. To by rozwiązywało mój problem z wgrywaniem obrazków. Przynajmniej na jakiś czas winksmiley.jpg

Ten post edytował qrzysztof 13.11.2009, 23:08:51


--------------------
Znalazłeś sam rozwiązanie swojego problemu? Nie pisz "już wiem, do zamknięcia". Podziel się rozwiązaniem - inni będą mieli łatwiej.
Go to the top of the page
+Quote Post
erix
post
Post #9





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




Cytat
Rozsądniejsze rozwiązanie to chyba umieszczenie w bazie oprócz adresu jakiegoś drugiego istotnego atrybutu. Najlepiej jakiejś sumy kontrolnej czy daty modyfikacji.

I po dodaniu obrazka spełniającego warunki, delikwent zmienia plik na zdalnym serwerze. Będziesz każdorazowo pobierał i sprawdzał? Trochę bez sensu. winksmiley.jpg

Lepiej byłoby pobrać do siebie.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
qrzysztof
post
Post #10





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

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


Oba rozwiązania mają swoje wady i zalety. Przy "hotlinkowaniu"

-oszczędza się miejsce na dysku,
-oszczędza swój transfer,
-chyba jednak trochę mniej naraża się na ewentualne roszczenia co do praw autorskich, bo pliki nie lądują na serwerze (ale może to tylko mit, w który ja uwierzyłem)

z drugiej strony takie rozwiązanie:

-jest mało bezpieczne (w/w kwestia umieszczania kodu w obrazkach)
-zabezpieczenie się przed takim kodem może być dużo trudniejsze niż przy zapisywaniu kopii u siebie
-jest mało stabilne - obrazek może zostać zmieniony,
-całkiem możliwe, że podbieranie komuś transferu może wywołać większy sprzeciw niż wgranie sobie jego obrazka do siebie (zwłaszcza jeśli dobrze się zabezpieczy w warunkach korzystania z serwisu),
-siłą rzeczy wymaga trochę więcej pracy przy oskryptowaniu, a tak od momentu zapisu na dysku wszystkie obrazki są traktowane jednakowo

Chyba jednak faktycznie szala lekko przechyla się w stronę tworzenia kopii.

A co do Imagicka to teoria teorią a praktyka praktyką niestety. Exec nazwa.pl mi blokuje więc stripa nie zrobię. Z drugiej strony nie wiem czy samo odczytanie przez imagick_readimage() i zapis przez imagick_writeimage() nawet bez zmiany rozdzielczości nie będą równoważne ze stripem. A jeśli nie to zmiana jakiegoś mało widocznego parametru powinna sprawę załatwić.

Hmmm, ale chciałem zrobić limit obrazka 100KB dla dysku i na przykład 300KB dla sieci (korzystając z tego, że to nie moja powierzchnia idzie). Teraz sprawa się skomplikuje - obrazka z sieci nikt sobie nie pomniejszy, a głupio będzie jak połowa będzie za duża. Z drugiej strony jeśli ja zmniejszę obrazek z czyjejś strony (nawet wgrany przez osobę trzecią) to już chyba wtedy ewidentnie podpadam pod jakiś paragraf. W tym układzie zastanawiam się czy w ogóle nie zrezygnować z możliwości dodawania obrazków z sieci. Raz że wszystko przechodzi wtedy przez dysk użytkownika (więc mniejsza szansa ewentualnych roszczeń). A dwa, widzę że mało który serwis daje możliwość wgrywania zdjęć z innych niż własne zasobów.

Ten post edytował qrzysztof 15.11.2009, 02:25:20


--------------------
Znalazłeś sam rozwiązanie swojego problemu? Nie pisz "już wiem, do zamknięcia". Podziel się rozwiązaniem - inni będą mieli łatwiej.
Go to the top of the page
+Quote Post
Blame
post
Post #11





Grupa: Zarejestrowani
Postów: 678
Pomógł: 124
Dołączył: 26.09.2009

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


Według mnie przy limicie który planujesz(100kb) dla każdego obrazka, możliwość wrzucania sobie innych z sieci jest raczej rzeczą zbędną. Jeśli ma to być forum albo jakiś portal gdzie te obrazki to avatary to te 100kb zupełnie wystarczy na świetnej jakości obrazek 100x100 i na dość ładny gif. No i oczywiście takie rozwiązanie jest o niebo prostsze/wygodniejsze.


--------------------
Go to the top of the page
+Quote Post
qrzysztof
post
Post #12





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

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


To nie będą awatary. Strona jest z testami i do pytań można dodawać zdjęcia.

Myślę, że rozmiar mógłbym dać max do 125KB. Nie tyle chodzi mi tu o dostępną powierzchnię na serwerze (bo ta jest więcej niż wystarczająca) co o szybkość ładowania się takiego obrazka potem i transfer z tym związany.

Wszystkie obrazki będą zmniejszane do max rozdzielczości 200x200. Chciałbym mieć te obrazki na serwerze w rozmiarze nie przekraczającym 125KB. Na etapie wgrywania obrazka mogę ewentualnie trochę podnieść limit. Pytanie tylko czy te biblioteki graficzne pozwalają ustalać sobie rozmiar pliku wyjściowego? Wydaje mi się, że jeśli na przykład skonwertuję wszystkie do jpg z rozmiarem 200x200 i jakością 90 to siłą rzeczy żaden nie przekroczy tych 125KB.

------

Powiedzmy, że nawet przy zapisaniu miniaturki 150x150 i wersji większej dostępnej na żądanie np 600x400 przy konwersji tego do jpega w jakości 90 mógłbym sobie spokojnie ustawić limit 0,5MB na taki obrazek a oba wyjściowe prawie na pewno nie przekroczyłyby 125KB. A 0,5MB to już wystarczy do większości obrazków.


--------------------
Znalazłeś sam rozwiązanie swojego problemu? Nie pisz "już wiem, do zamknięcia". Podziel się rozwiązaniem - inni będą mieli łatwiej.
Go to the top of the page
+Quote Post
Blame
post
Post #13





Grupa: Zarejestrowani
Postów: 678
Pomógł: 124
Dołączył: 26.09.2009

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


Ale zaraz zaraz, po co ta konwersja? po co tyle kombinowania? Ustalasz sobie limit wielkości i rozmiaru obrazka i jeśli jest większy to bardzo mi przykro i tyle. Po co chcesz obciążać serwer czymś co leży w interesie użytkownika i zajmie mu max 30 sekund?


--------------------
Go to the top of the page
+Quote Post
qrzysztof
post
Post #14





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

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


To w przypadku obrazków z sieci tylko. Wtedy dodawanie z sieci miałoby sens bo raz że większość obrazków mieściłaby się w limicie, a na serwerze dużo by nie zajmowały. A tak alternatywa to albo niski limit, albo duże pliki na serwerze. Szczególnie to ostatnie byłoby uciążliwe, bo plik jest wgrywany raz, a wyświetlany wiele razy.


--------------------
Znalazłeś sam rozwiązanie swojego problemu? Nie pisz "już wiem, do zamknięcia". Podziel się rozwiązaniem - inni będą mieli łatwiej.
Go to the top of the page
+Quote Post
Blame
post
Post #15





Grupa: Zarejestrowani
Postów: 678
Pomógł: 124
Dołączył: 26.09.2009

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


Chodziło mi o to, że to użytkownik powinien się przejmować tym, żeby jego obrazek mieścił się w ustalonych przez ciebie limitach a ty tylko sprawdzasz czy tak jest, jeśli nie to go odrzucasz i wywalasz komunikat. Po co sobie życie komplikować?


--------------------
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: 20.08.2025 - 10:09