2011-11-06 9 views
9

Sprawdzanie typu mime w php jest dość łatwe, ale o ile wiem, mim może zostać sfałszowany. Osoba atakująca może przesłać skrypt php, na przykład jpeg typu mime. Jedna rzecz, która przychodzi do głowy, to sprawdzenie rozszerzenia pliku przesłanego pliku i upewnienie się, że pasuje do typu MIME. Wszystko to zakłada, że ​​katalog do przesyłania jest dostępny w przeglądarce.MIME Type spoofing

Pytanie: Czy istnieją inne techniki zapobiegania "złym plikom" przed wprowadzaniem podszywania się pod mime?

+2

Czy masz pytania dotyczące podszywania się pod typ mime, czy chcesz tylko sprawdzić poprawność przesłanych plików, aby sprawdzić, czy są to pliki graficzne? – CodeCaster

+0

Tak naprawdę, nie powinieneś polegać na typach MIME i rozszerzeniu pliku (a twoje sprawdzenie, jeśli mime-> rozszerzenie, jest również błędne, jeśli podrabiam mime, mogę jeszcze łatwiej zmyślić odpowiedni plik xtension) –

+0

@CodeCaster: Jak upewnić się, że pliki typu MIME przesłanych plików nie są sfałszowane? – abruski

Odpowiedz

8

Krótka odpowiedź: Nie

Dłuższa odpowiedź:

Porównując rozszerzenie i upewniając się, że pasuje do typu MIME nie naprawdę zapobiec niczego. Jak powiedziano w komentarzach, nawet łatwiej jest zmodyfikować rozszerzenie pliku. Typ MIME i rozszerzenie mają jedynie charakter wskazówek, nie ma w nich nieodłącznego zabezpieczenia.

Zapewnienie, że przychodzące pliki nie wyrządzają szkody, zależy w dużym stopniu od tego, jaki będzie ich cel. W twoim przypadku zrozumiałem, że spodziewasz się obrazów. Możesz więc najpierw wykonać kilka testów poprawności: zeskanuj pierwsze kilka bajtów, aby sprawdzić, czy pliki zawierają odpowiednie sygnatury nagłówka obrazu - wszystkie odpowiednie formaty mają je.

"Nagłówki sygnatur" pomagają zdecydować, jaki format obrazu próbuje się podrobić plik. W następnym kroku możesz sprawdzić, czy reszta zawartości jest zgodna z podstawowym formatem obrazu. Gwarantuje to, że plik jest w rzeczywistości plikiem graficznym o tym konkretnym formacie.

Ale nawet wtedy plik mógłby być starannie spreparowany w taki sposób, że po wyświetleniu obrazu, popularna biblioteka używana do wyświetlania tego obrazu (np. Libpng itp.) Natrafiłaby na przepełnienie bufora, które atakujący znalazł w tym biblioteka.

Niestety nie ma sposobu, aby aktywnie temu zapobiec, nie dopuszczając w ogóle żadnych danych ze strony klienta.

+0

Obrazy były tylko przykładami. Zajmie się plikami PDF. Ale chciałem uogólnić pytanie, aby pomogło to również w innych typach plików. – abruski

+1

Zasada jest zawsze taka sama. Inteligentny atakujący daje ci to, czego oczekujesz, ale tworzy plik w taki sposób, aby wykorzystywał najpopularniejsze biblioteki używane do przeglądania plików. W przypadku plików PDF oznaczających, że mogą one osadzać Javascript, filmy, obrazy ponownie ... liczba opcji drastycznie wzrasta wraz z funkcjami udostępnianymi przez format danych. Jeśli Ty (lub Twoi klienci!) Nigdy nie "wykonasz" (oglądanie też "wykona") przesłanej zawartości, tylko wtedy będziesz bezpieczny. – emboss

+0

Możliwe jest uzyskanie "bezpiecznego" obrazu poprzez skopiowanie go do nowego obrazu przy użyciu biblioteki takiej jak GD lub narzędzia takiego jak ImageMagick. AFAIK, nie jest znany otwarty exploit dla żadnej z tych bibliotek - kiedyś był taki w Windows GDI, ale został już naprawiony od dawna. Chociaż prawdą jest, że teoretycznie nie ma bezpieczeństwa, istnieją * sposoby radzenia sobie z plikami w bezpieczny sposób. –

-4

Sprawdź rozszerzenie.

<?php 

$okFiles = array('jpg', 'png', 'gif'); 

$pathInfo = pathinfo($filename); 

if(in_array($pathInfo['extension'], $okFiles)) { 
    //Upload 
} 
else { 
    //Error 
} 

?> 

Możesz również - jak powiedziałeś - sprawdzić, czy rozszerzenie pasuje do typu MIME, ale o wiele łatwiej jest po prostu sprawdzić rozszerzenie.

Btw dlaczego obchodzi Cię typ MIME?

+0

, aby upewnić się, że przesłany plik wygląda tak, jak się wydaje. Wyobraź sobie: przesyłaj obraz MIME, ale z wewnątrz kod php i php; katalog przesyłania jest dostępny w przeglądarce i wyobrażam sobie, że atakujący może swobodnie uruchomić złośliwy kod. – abruski

+1

@ABruski Tak więc nie musisz w ogóle sprawdzać typu MIME. Po prostu sprawdź rozszerzenie. Jeśli jest to jpg/png/gif, to jest w porządku, w przeciwnym razie zgłoś błąd "Tylko jpg/png/gif". Nie wiem, czy to jest to, czego się boisz, ale jeśli rozszerzenie to .jpg i MIME sais PHP, nadal będzie traktowane jak obraz podczas przeglądania pliku. – Sawny

+0

Też rozważałem to. Po prostu staram się upewnić, że jestem na dobrej drodze. – abruski

4

W przypadku obrazów

  • sprawdzić rozszerzenie z listy dozwolonych te (np. ".jpg", ".jpeg", ".png")
  • Sprawdź sam plik przesłany przez Uruchomienie pliku getimagesize spowoduje zwrócenie FALSE, jeśli nie jest obrazem.

Inne typy przesyłania

  • Sprawdź dozwolonych rozszerzeń (np. ".pdf")
  • Sprawdź, czy typ MIME pliku odpowiada rozszerzeniu

Sample kod:

function getRealMimeType($filename) { 
    $finfo = new finfo(FILEINFO_MIME, "/usr/share/misc/magic"); 
    if (!$finfo) { 
     echo "Opening fileinfo database failed"; 
     return ""; 
    } 
    return $finfo->file($filename); 
} 

Zobacz finfo_file dokumentacji.

+0

To nie musi być obraz, może to być dowolny plik. – abruski

+0

Rozumiem, pozwól mi rozwinąć odpowiedź. – stivlo

+0

To świetnie, jeśli getimagesize zwraca wartość false, jeśli nie jest obrazem :-) bardzo przydatne do sprawdzania identyfikatora, ale co, jeśli rozszerzenie jest sfałszowane, a także typ MIME? –