2015-10-26 3 views
1

У меня есть скрипт проверки подлинности PHP MIME для проверки файлов, загружаемых на веб-сайт. Проблема с текущим решением, что можно легко переименовать dodgy.php, чтобы стать безвредным.pdf, и он пройдет проверку и загрузку ... Я думаю, мне нужно использовать логику finfo_file PHP 5 для более точного проверки файла, но не уверен, как лучше всего интегрировать это в мое текущее решение ... Любые советы? Текущее закодированы решение, как показано ниже, что должно позволить загружать только .doc, .docx и файлы в формате .pdf:Проверка загрузки файла PHP finfo_file

$allowedExts = array(
    "pdf", 
    "doc", 
    "docx" 
); 

$allowedMimeTypes = array( 
    'application/msword', 
    'application/pdf', 
    'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 
    'application/x-pdf', 
    'application/vnd.pdf' 
); 

$extension = end(explode(".", $_FILES["fileinputFileName"]["name"])); 

if (! (in_array($extension, $allowedExts))) { 
//throw error 
$hook->addError('fileinputFileName','Please ensure you select a PDF, DOC or DOCX file.'); 
return $hook->hasErrors(); 
} 

if (in_array($_FILES["fileinputFileName"]["type"], $allowedMimeTypes)) 
{ 
// all OK - proceed  
return true; 
} 
else 
{ 
//throw error 
$hook->addError('fileinputFileName','Please ensure you select a PDF, DOC or DOCX file.'); 
return $hook->hasErrors(); 
} 

В противном случае код примера:

$finfo = new finfo(FILEINFO_MIME_TYPE); 
if (false === $ext = array_search(
    $finfo->file($_FILES["fileinputFileName"]["tmp_name"]), 
    array(
     'doc' => 'application/msword', 
     'pdf' => 'application/pdf', 
     'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 
     'pdf' => 'application/x-pdf', 
     'pdf' => 'application/vnd.pdf' 
    ), 
    // all OK - proceed  
    return true; 
)) { 
    //die('Please provide another file type [E/3].'); 
    $hook->addError('fileinputFileName','Please ensure you select a PDF, DOC or DOCX file.'); 
    return $hook->hasErrors(); 
} 

ответ

0

Как вы уже, опираясь на расширение файла не может быть лучшей стратегией здесь. Вместо этого вы можете попытаться обнаружить mimetype файла с помощью finfo. Из PHP документации:

// DO NOT TRUST $_FILES['upfile']['mime'] VALUE !! 
// Check MIME Type by yourself. 
$finfo = new finfo(FILEINFO_MIME_TYPE); 
if (false === $ext = array_search(
    $finfo->file($_FILES['upfile']['tmp_name']), 
    array(
     'jpg' => 'image/jpeg', 
     'png' => 'image/png', 
     'gif' => 'image/gif', 
    ), 
    true 
)) { 
    throw new RuntimeException('Invalid file format.'); 
} 

http://php.net/manual/en/features.file-upload.php

+0

Спасибо Павла, - я думал, что мой код проверял тип Мима? – dubbs

+0

Я считаю, что тип, отправленный здесь, не выводится из файла, а зависит от имени файла. –

+0

ОК. Просто пошел на реализацию, но получил ошибку сервера. Код, который я использую, включен в обновленный вопрос выше. Есть идеи, в чем проблема? – dubbs

Смежные вопросы