2011-07-19 18 views
23

Użyłem tego kodu do sprawdzenia typu obrazów,Jak sprawdzić dodany typ pliku w PHP

$f_type=$_FILES['fupload']['type']; 

if ($f_type== "image/gif" OR $f_type== "image/png" OR $f_type== "image/jpeg" OR $f_type== "image/JPEG" OR $f_type== "image/PNG" OR $f_type== "image/GIF") 
{ 
    $error=False; 
} 
else 
{ 
    $error=True; 
} 

ale niektórzy użytkownicy skarżą się, że pojawia się błąd podczas przesyłania wszelkiego rodzaju obrazów, podczas gdy inni don” t dostań żadnych błędów!

Zastanawiałem się, czy to rozwiązuje problem:

if (mime_content_type($_FILES['fupload']['type']) == "image/gif"){...

Wszelkie komentarze?

Odpowiedz

64

Nigdy nie używaj $_FILES..['type']. Informacje w nim zawarte nie są w ogóle weryfikowane, jest to wartość zdefiniowana przez użytkownika. Przetestuj typ samodzielnie. W przypadku obrazów, exif_imagetype jest zwykle dobrym wyborem:

$allowedTypes = array(IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_GIF); 
$detectedType = exif_imagetype($_FILES['fupload']['tmp_name']); 
$error = !in_array($detectedType, $allowedTypes); 

Alternatywnie finfo functions są świetne, jeśli serwer je obsługuje.

+0

Błąd! Wywołanie niezdefiniowanej funkcji exif_imagetype() – John

+0

Myślę, że te rozszerzenia nie są włączone na moim hostie udostępnionym: 'extension = php_mbstring.dll extension = php_exif.dll' – John

+0

@John Spróbuj http://upgradephp.berlios.de, następnie zapewnia zamiennik. – deceze

7

Oprócz @deceze, można również finfo() sprawdzić MIME typu non-image-files:

$finfo = new finfo(); 
$fileMimeType = $finfo->file($path . $filename, FILEINFO_MIME_TYPE); 
-5

UWAGA: poniższa odpowiedź nie faktycznie sprawdzić typ pliku. Sprawdza tylko nazwę. Jest to nieodpowiednie dla rzeczywistych celów bezpieczeństwa.

EDYCJA: Nie używaj tej metody ponieważ nie służy do sprawdzania bezpieczeństwa. Pozostawiam tutaj tę odpowiedź, aby nikt nie popełnił tego samego błędu, jak ja, próbując tego.


Próbowałem następujące i pracował dla mnie:

$allowed = array('gif','png' ,'jpg', 'pdf'); 
$filename = $_FILES['input_tag_name']['name']; 
$ext = pathinfo($filename, PATHINFO_EXTENSION); 
if(!in_array($ext,$allowed)) { 
    echo 'error'; 
} 

Source link

+12

** OSTRZEŻENIE! To absolutnie nic nie sprawdza! ** Wszystko, co robi, to sprawdzenie, czy rozszerzenie znajduje się w dozwolonej tablicy. Jeśli zmienisz nazwę pliku 'myVirus.exe' na' myVirus.jpg', przejdzie on przez twoją funkcję. Oczywiście to jest ** NIE ** czego chcesz ... – Byson

+1

Jest to bardzo niebezpieczne .... Unikaj i nigdy nie używaj go do poważnych sprawdzeń plików – ErickBest

0

W PHP 5.5 używam tej funkcji dla uzyskania typ pliku i sprawdzić, czy obraz:

function getFileType($file) { 
    return image_type_to_mime_type(exif_imagetype($file)); 
} 

// Get file type 
$file_type = getFileType('path/to/images/test.png'); 
echo $file_type; 
// Prints image/png 
// 1. All images have mime type starting with "image" 
// 2. No other non-image mime types contain string "image" in it 

Następnie możesz zrobić:

if (strpos($filetype, 'image') !== false) { 
    // This is an image 
} 

pełna lista typów MIME: http://www.sitepoint.com/web-foundations/mime-types-complete-list/

0

Oczywiście można sprawdzić, czy jest to obraz z EXIF, ale lepszym sposobem myślę to zrobić z finfo jak ten:

$allowed_types = array ('application/pdf', 'image/jpeg', 'image/png'); 
$fileInfo = finfo_open(FILEINFO_MIME_TYPE); 
$detected_type = finfo_file($fileInfo, $_FILES['datei']['tmp_name']); 
if (!in_array($detected_type, $allowed_types)) { 
    die ('Please upload a pdf or an image '); 
} 
finfo_close($fileInfo); 
1

Najlepszym sposób w mojej opinii jest najpierw używać getimagesize(), a następnie imagecreatefromstring().

$size = getimagesize($filename); 
    if ($size === false) { 
     throw new Exception("{$filename}: Invalid image."); 
    } 
    if ($size[0] > 2500 || $size[1] > 2500) { 
     throw new Exception("{$filename}: Image too large."); 
    } 

    if (!$img = @imagecreatefromstring(file_get_contents($filename))) { 
     throw new Exception("{$filename}: Invalid image content."); 
    } 

Sprawdzanie przez getimagesize() zapobiega kilka ataków DoS, ponieważ nie musimy starać się imagecreatefromstring() z każdego pliku dostarczonego przez użytkownika, albo plik bez obrazu lub pliku zbyt duże. Niestety, zgodnie z PHP docs nie można polegać na sprawdzaniu zawartości typu obrazu.

Wreszcie próbuje otworzyć plik jako obraz - jeśli się powiedzie - mamy obraz.

0

Jest to prosty, jednoliniowy skrypt, którego często używam.

$image = "/var/www/Core/temp/image.jpg"; 
$isImage = explode("/", mime_content_type())[0] == "image"; 

Zasadniczo używam mime_content_type(), aby uzyskać coś w rodzaju „image/jpg”, a następnie wybucha go przez „/” i sprawdzenie przed pierwszym elemencie tablicy, aby zobaczyć, czy to mówi „obraz”.

Mam nadzieję, że to działa!