Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Detekcja typu plikow
Forum PHP.pl > Forum > PHP
zdandro
Witam wszystkich.

Mam taki problem - otoz stworzylem skryt uploadujacy plik (Cv) na serwer. Mozliwy jest upload tylko 5 typow plikow - *.pdf, *txt, *rtf, *doc i *.docx. Jak na razie dziala to w oparciu o sprawdzanie typu MIME poszczegolnych plikow. I TU wasnie tkwi problem - uzytkownik moze zmienic rozszerzenie pliku *.exe na *.txt powiedzmy i pozniej moj klient uruchomi taki plik ktora jest w rzeczywistosci szkodliwa aplikacja lub szkodliwym plikiem *.vb, *.js badz jeszcze innym... Czy mozna sprawdzic jaki typ pliku jest rzeczywiscie uplodowany? Sprawdzania naglowkow jest mozliwe przy plikach graficznych wiec jak to zrobic przy dokumentach?

Z gory dziekuje z odpowiedz

Oto kod skryptu:

  1. <?php
  2. $correctdate = time('H-i-s');
  3.  
  4. if( is_uploaded_file( $_FILES['userfile']['tmp_name'] ))
  5. {
  6. if (($_FILES['userfile']['type'] == 'application/msword') ||
  7. ($_FILES['userfile']['type'] == 'application/pdf') ||
  8. ($_FILES['userfile']['type'] == 'application/vnd.openxmlformats-officedocument.wordprocessingml.document') ||
  9. ($_FILES['userfile']['type'] == 'text/plain') ||
  10. ($_FILES['userfile']['type'] == 'application/rtf'))
  11. {
  12.  
  13. $strUploadDir = 'Cv/' .$correctdate."-". $_FILES['userfile']['name'];
  14.  
  15. if( move_uploaded_file( $_FILES['userfile']['tmp_name'], $strUploadDir ))
  16. {
  17. echo '<div id=\"MsgUpload\">File has been uploaded successfully.</div>';
  18. }
  19. else
  20. {
  21. echo '<div id=\"MsgUpload\">There have been some errors :(</div>';
  22. }
  23. }
  24. else
  25. {
  26. echo '<div id=\"MsgUpload\">Sorry. Wrong file type. Only particular file types are accepted: *.doc, *.docx, *.txt, *.rtf, *.pdf .</div>';
  27. }
  28. }
  29. ?>
  30.  
CuteOne
Może pomoże http://www.beldzio.com/bezpieczny-upload-plikow
zdandro
Dzieki za odpowiedz. Ale nie jest to chyba to czego szukalem sad.gif Dokladnie chodzi mi o programistyczne wyeliminowanie niechcianych plikow nie ograniczajac sie do modyfikowania plikow konfiguracyjnych.

Nie ma zadnego innego sposobu?
vokiel
Cytat(zdandro @ 14.08.2010, 11:03:57 ) *
Jak na razie dziala to w oparciu o sprawdzanie typu MIME poszczegolnych plikow. I TU wasnie tkwi problem - uzytkownik moze zmienic rozszerzenie pliku *.exe na *.txt powiedzmy i pozniej moj klient uruchomi taki plik (...)


Jeśli operujesz na MIME to nie na rozszerzeniach, to dwie różne rzeczy. Do sprawdzenia MIME pliku masz fileinfo.

Ze zdjęciami nie ma problemu, bo możesz je przepuścić przez funkcje generujące grafikę (imagecreate). Z innymi plikami jest problem, bo ktoś może brać nagłówki z właściwych plików, a dopisać resztę z innego, jednak wtedy plik otworzy się w domyślnej aplikacji i raczej ją wywróci czy powstaną krzaki, aniżeli się uruchomi.
zdandro
Menedzer w firmie sie uparl sie na sprawdzanie plikow a mowilem mu wczesniej ze - jak napisales wczesniej Vokiel - po zmianie formatu plik bedzie w formie "krzaczkow".

Dzieki za odpowiedzi
erix
Sprawdzaj MIME po stronie serwera, to najpewniejsze rozwiązanie. Jeśli chodzi o obrazki, to sprawdzaj również, czy nie ma tam przypadkiem ciągu otwierającego blok PHP, gdyż i w ten sposób da się przemycić trojana.

Jeśli używasz PHP starszego niż 5.3 i masz dostęp do poleceń powłoki, wywołaj
Kod
file -bi plik

i w zwróconym wyniku dostaniesz MIME pliku.
Zyx
Zasadniczo nie ma w 100% skutecznej metody detekcji. Jak komuś zależy, to i w pliku graficzym przemyci kod wykonywalny. Nie wiem czy masz wpływ na rozszerzenia dostępne na serwerze, ale jeśli masz, to zainteresuj się tym rozszerzeniem:

http://docs.php.net/manual/en/book.fileinfo.php

Pozwala ono na "odgadnięcie" typu MIME na podstawie specyficznych, "magicznych" sekwencji bajtów umieszczonych w treści pliku. Jest to heurystyka, ale dość skuteczna i ma tę zaletę, że nie polega na informacji o typie MIME dostarczonej przez przeglądarkę, która może być sfałszowana.
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.