Tekst powstał na podstawie postu Zeeva Suraskiego na BUGTRAQ'u. Na początku omówie krótko jak w PHP działa uploadowanie plików, a później przejde do sedna problemu. Każdy plik wysłany do naszego skryptu za pomocą formularza jest zapisywany do katalogu tymczasowego z unikalna nazwą (np. /tmp/php9jsikE). Informacje o tym gdzie się znajduje są zapisywane w odpowiedniej zmiennej. Jej nazwa zależy od nazwy wybranej w formularzu. Np. W formularzu napisaliśmy: <input type=file name=userfile> w zmiennej $userfile będzie znajdować się scieżka do tymczasowego pliku na serwerze. Problem polega na tym, że ktoś może jako parametr w urlu podać userfile z nazwa jakiegoś normalnego pliku na serwerze. Czy to może nam zaszkodzić zależy tylko od tego, co robimy z danym plikiem. Jeśli kopiujemy go do jakiegos publicznie dostępnego miejsca, to można wpisać w swojej przeglądarce np. http://serwer.pl/upload.php?userfile=/etc/passwd i już dostajemy pełną listę użytkowników na tym serwerze... Trzeba jednak pamiętać, że w ten sposób można dostać się jedynie do plików, do których ma dostęp user, z prawami którego dziala demon http (najczęściej nobody). Mimo wszystko jest to niebezpieczne. Rozwiązania: Zeev proponuje wyłączenie funkcji register_globals, przez co parametry z urla nie zostaną wpisane do odpowiadającym im zmiennym i wyciągnięcie danych z $HTTP_POST_VARS. Jednak moim zdaniem to niewiele pomoże bo przecież te informacje mogą być tak samo sfałszowane, będzie to tylko wymagało trochę więcej pracy. Jedynym sensownym rozwiązaniem jest dokładne sprawdzanie pliku, który dostajemy. Nowe wersje PHP (4.0.3RC1 i 3.0.17RC1) zostały już wyposażone w funkcję, która pomaga w zabezpieczeniu się przed tego typu oszustwami - is_uploaded_file($sciezka); PHP 4.0.3 zawiera także funkcję move_uploaded_file($sciezka, $nowa_sciezka), która kopiuje plik pod warunkiem, że został zuploadowany. Jeśli pracujemy na starszym PHP i nie zamierzamy, lub nie możemy zaktualizować go musimy sami napisać odpowiednie funkcje. Możemy np. sprawdzić datę utworzenia domniemanego pliku tymczasowego i odrzucić go, jeśli jest mniejsza o np minutę. Jeśli oczekujemy rysunku to za pomocą funkcji PHP możemy sprawdzić czy plik rzeczywiście jest rysunkiem. Napewno można wymyślić też inne reguły specyficzne dla danego typu plików. strona 1 Autor: Paweł *peewee* Subocz | Zobacz również: XML (1) Technologia J2EE (1) Java i bazy danych Kartki Internetowe Apache + Tomcat PHP, MySQL i własna wyszukiwarka Bezpieczne uploadowanie plików Masz problem ze swoją komórką? Zapytaj, przeczytaj opinie o telefonie: LG G1600 Sagem myC5-3 Motorola E1000 Trium Cosmo Alcatel OT557 i-mate K-JAM Samsung A777 Benefon TWIG Discovery Pro palmOne Treo 270 LG LX150
(C) 2000-2010 webdeveloper.pl | Napisz do nas
| ||||||||||