2011-06-23 11 views
7

Ok, pozwalam (w ramach skryptu) na przesyłanie określonych typów plików za pośrednictwem zdefiniowanego przez administratora forum podejścia! Skąd mam wiedzieć, czy te pliki są tego typu, które administrator ustawił, aby upewnić się, że nie są fałszywymi plikami. Obecnie używam podejścia typu mime, ale różne przeglądarki mogą ustawiać różne typy MIME, więc to niewiele pomaga. Sprawdzanie rozszerzenia pliku również nie pomaga, ponieważ ludzie mogą obejść ten problem, nadając mu dozwolone rozszerzenie, ale będzie to inny typ pliku.Jak się upewnić, że przesyłają określone pliki?

Być może istnieje odniesienie do sposobu sprawdzenia bajtów w wielu różnych typach plików, aby upewnić się, że jest poprawny? Być może można to również sfałszować, ale przynajmniej bardziej precyzyjnie byłoby użyć formularza do przesyłania plików i wysyłania ich.

Czy ktoś może mi pomóc z pomysłami na ten temat?

Dzięki :)

+0

Jakiego rodzaju plików oczekujesz? W zależności od pliku możesz przeczytać ich nagłówek, aby zobaczyć, jaki to plik. – alex

+0

Cóż, administrator wybiera pliki, które mają być dozwolone do przesłania, umieszczając w rozszerzeniu każdego rozszerzenia pliku oddzielonego przecinkami. Teraz muszę po prostu "rozłożyć (", ", $ rozszerzenia)' na nim i upewnić się, że typ pliku jest poprawny dla wszystkich rozszerzeń w tej tablicy, która zostanie zwrócona. Czy jest jakiś sposób na zrobienie tego? Jakie pliki możesz przeczytać w nagłówku? A jakich plików nie możesz przeczytać w nagłówku? Czy masz pomysł na lepszy sposób wdrożenia tego, który byłby lepszy dla bezpieczeństwa i/lub kodowania? – SoLoGHoST

+0

Spójrz na ['mime_content_type()'] (http://php.net/manual/en/function.mime-content-type.php). – alex

Odpowiedz

3

PECL fileinfo (lub wbudowanej> 5,3) poddadzą sygnatur bajtowych plików odgadnąć ich typów MIME, więc chroni przed ludzie po prostu zmieniając rozszerzenie pliku. W niektórych przypadkach możliwe jest dołączenie złośliwych bajtów do pliku zgodnego z odpowiednią sygnaturą bajtu dla typu pliku.

Od docs PHP:

// Procedural style 
$finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension 
echo finfo_file($finfo, $filename); 
finfo_close($finfo); 

// OO style 
$finfo = new finfo(FILEINFO_MIME_TYPE); 
echo $finfo->file($filename); 
$finfo->close(); 

na serwerze UNIX, wierzę finfo_file() konsultuje tę samą bazę sygnatur bajt jako narzędzia GNU file.

+0

@Phoenix Myślę, że po raz trzeci w tym tygodniu usunąłeś i10n z jednego z adresów URL moich dokumentów PHP. Będę pamiętać, aby zrobić to sam od teraz :) –

+0

Dzięki Michael, spróbuję. – SoLoGHoST

0

Nigdy nie ufaj wprowadzaniu danych przez użytkownika. Sprawdzanie, czy dany typ pliku/typ MIME nie powinien być nigdy używany, aby zapobiec przesyłaniu szkodliwej zawartości na serwer. Jeśli celem jest ochrona serwera, po prostu nie zezwalaj na uruchamianie zawartości na serwerze, jeśli została przesłana przez użytkownika. W przypadku plików pobieranych przez inne osoby należy złożyć oświadczenie, że treść została wygenerowana przez użytkownika i nie gwarantuje się, że jest wolna od wirusów.

Powiązane problemy