Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] bezpieczny upload PDF, DOC i DOCX
Forum PHP.pl > Forum > PHP
grudziu
Witam,

zapytanie: jak stworzyć bezpieczny upload dla internautów plików (tylko dokumenty) na serwer?

Chciałem to zrobić poprzez sprawdzenie rozszerzenia po kropce (czyli .pdf, .doc, .docx) , dalej po stronie przeglądarki ale niestety chyba Firefox pdf rozpoznaje jako application/ms-download czyli tak samo jak exe, a więc już po stronie przeglądarki nie ma co sprawdzać... w związku z tym chciałem oprzeć wszystko na sprawdzeniu typu MIME po stronie serwer'a, ale niestety funkcja mime_content_type() jest nieobsługiwana - i nie będzie... - przez serwer na którym wgram skrypt uploadu.

Zaczerpnięte z php.net
  1. <?php
  2. if (!function_exists('mime_content_type ')) {
  3. function mime_content_type($filename) {
  4. $finfo = finfo_open(FILEINFO_MIME);
  5. $mimetype = finfo_file($finfo, $filename);
  6. finfo_close($finfo);
  7. return $mimetype;
  8. }
  9. }
  10. ?>

Ten fragment również nie działa.


Jakieś pomysły?
marcio
Jesli chcesz sprawdzac po kropce to explode() a jak naglowki to ja mam tak:
  1. <?php
  2. $uploaded_file = $_FILES['up_file']['tmp_name'];
  3. $roz = $_FILES['up_file']['type'];
  4. $extension = array('image/jpg', 'image/jpeg', 'image/gif', 'image/png');
  5. $info=getimagesize($uploaded_file);
  6. $typ=$info['mime'];
  7. $szerokosc=$info[0]; 
  8. $wysokosc=$info[1];
  9. $width = 130;
  10. $height = 130;
  11. $quality = 75;
  12.  
  13. if(@is_uploaded_file($uploaded_file)) {
  14.  
  15.  if(in_array($roz, $extension)) {
  16.  
  17. //etc....
  18. ?>
grudziu
Tylko że getimagesize odnosi się do obrazków, ja mam PDF, DOC i DOCX...
marcio
Ah no fakt zapomnialo mi sie no to pozostaje ci explode() albo klasa @Cysiaczek
http://forum.php.pl/index.php?showtopic=80...t=0&start=0

P.S
  1. <?php
  2. $roz = $_FILES['up_file']['type'];
  3. ?>

Tu masz typ uploadowanego pliku wiec wystarczy ze zmienisz naglowki na twoje i kod bedzie dzialal
legorek
Odnośnie:

$_FILES['costam']['type'];

to manual jasno mówi, że nie wolno temu ufać. Sprawdzanie rozszerzenie jest jeszcze gorszym sposobem.
Jeśli możesz użyj funkcji: finfo_file" title="Zobacz w manualu PHP" target="_manual

Jeśli nie, zobacz sobie komentarze do mime_content_type" title="Zobacz w manualu PHP" target="_manual tam znajdziesz kilka lepszych lub gorszych sposobów.

Lub zajrzyj tutaj

Prawa jest taka, że nigdy nie będziesz miał pewności, bo plik może mieć sfałszowany/uszkodzony nagłówek.
marcio
Chyba wiadomo ze mozna spoofowac naglowki za pomoca live http headers ale praktycznie nigdy nie dziala np u mnie nie smile.gif

EDIT:
Zreszta w linku ktory podalem jest podane najlepsze rozwiazanie na ten problem dodatkowo jak chcesz mzoe sprawdzac naglowki ale po co?
ALbo jedno albo drugie
grudziu
Cytat(legorek @ 9.06.2008, 12:42:57 ) *
Odnośnie:

$_FILES['costam']['type'];

to manual jasno mówi, że nie wolno temu ufać. Sprawdzanie rozszerzenie jest jeszcze gorszym sposobem.
Jeśli możesz użyj funkcji: finfo_file" title="Zobacz w manualu PHP" target="_manual

Jeśli nie, zobacz sobie komentarze do mime_content_type" title="Zobacz w manualu PHP" target="_manual tam znajdziesz kilka lepszych lub gorszych sposobów.

Lub zajrzyj tutaj

Prawa jest taka, że nigdy nie będziesz miał pewności, bo plik może mieć sfałszowany/uszkodzony nagłówek.


mime_content_type i komentarze - przeczytałem, nie działa u mnie na serwerze tak jak finfo_file - również nie działa

Dzięki za link google, może coś w tym gąszczu uda się znaleźć.
marcio
Nie rozumiem co masz szukac podalem ci wyzej temat z rozwiazaniem wystarczy dac odpowiednie rozszerzenia i hula.....
grudziu
Cytat(marcio @ 9.06.2008, 15:06:47 ) *
Nie rozumiem co masz szukac podalem ci wyzej temat z rozwiazaniem wystarczy dac odpowiednie rozszerzenia i hula.....


$_FILES [type] - ja wiem że to hula i ten sposób znałem ale to nie jest ani bezpieczne dodatkowo uzależnione od przeglądarki, a chociażby firefox sprawdza pdf'a jako application/ms-download i jest analogiczne z aplikacją exe.

W linku który podałeś z tego co ja rzuciłem okiem i poświęciłem dwie minuty to ktoś sie bawi w obiekty przy sprawdzaniu typu samego rozszerzenia (czyli po kropce co jest napisane, a nie typ pliku) biggrin.gif mozna i tak ale to mi się nie podoba.

dzięki za odpowiedzi
mike
~grudziu tak czytam ten wątek i dochodzę do wniosku że powinieneś już wszystkie wiedzieć połowę postów temu.
Sprawa jest prosta, masz dwa wyjścia.
1. Korzystasz z narzędzi naprawdę sprawdzających typ pliku: MIME types, etc;
2. Sprawdzasz rozszerzenie.

Nie ma alternatywy bo nie wiem czy wiesz ale przeglądarki wysyłają MIME na podstawie rozszerzenia więc na jedno wychodzi.
grudziu
A jednak udało mi się znaleźć (własciwie to wymęczyłem to od supportu home.pl któremu dziękuję) rozwiązanie:

system("file -i $plik");
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.