2012-04-24 2 views
2

Новый парень задает вопрос, что должно быть выполнено с помощью простых решений.проверка сервера загрузки файлов - разрешить только изображения с php

Я пробовал кучу кода. Кажется, я могу получить поток файлов для getimagesize и заставить другие вещи работать без сбоев.

Я убираю старый проект, который должен ограничивать загруженные файлы, чтобы они были только файлами изображений и ничего зла.

Этот код всегда дает мне сообщение об ошибке независимо от того, что

$imageinfo = getimagesize($_FILES['bf_file'][$key]['tmp_name']); 
if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg') { 
alert ("Sorry, we only accept GIF and JPEG images"); 
exit; 
} 

Вот черный список усилий

$blacklist = array(".php", ".phtml", ".php3", ".php4", ".js", ".shtml", ".pl" ,".py" 
,".txt", ".doc"); 

foreach ($blacklist as $file) 
{ 
if(preg_match("/$file\$/i", $_FILES['bf_file'][$key]['tmp_name'])) 
{ 
alert "ERROR: Uploading executable files Not Allowed\n"; 
exit(); 
} 
} 

Вот еще один getimagesize

$size = getimagesize($_FILES[bf_file][$key][tmp_name]); 
$fp = fopen($_FILES[bf_file][$key][tmp_name], "rb"); 
if ($size && $fp) { 
header("Content-type: {$size['mime']}"); 
fpassthru($fp); 
continue; 
} else 
// error 
alert("Inappropriate file type"); 

На каждой из них Я получаю сообщение об ошибке независимо от того, загружен ли файл или нет.

Мне просто нужно разместить эти элементы управления где-нибудь в моем файле, чтобы, если загруженный файл прошел проверку, все просто проходит через загрузчик, а все остальное работает так, как должно, но без преимуществ этих ограничителей и проверок.

Кроме того, пользователю не требуется загружать файл. Есть 3 поля, тема, загрузка файлов и файлов. Только субъект и тело должны иметь данные, и это работает прямо сейчас.

Любая помощь будет принята с благодарностью.

Спасибо,

Джеймс

+3

Какова ценность '$ key'? Независимо от того, что он содержит, из-за некоторой глупости * премиум-класса со стороны некоторых авторов PHP давным-давно вам нужно будет ссылаться на '$ _FILES ['bf_file'] ['tmp_name'] [$ key]' вместо из '$ _FILES ['bf_file'] [$ key] ['tmp_name']'. Также обратите внимание, что 'getimagesize()' - единственный разумный способ сделать это, я даже не могу начать объяснять, что не так с вашим черным списком, на небольшом пространстве, которое дает мне комментарий. – DaveRandom

+1

Вот один: ваш preg_match не является многострочным, поэтому уязвим для пропущенных атак. Одна из тысячи причин использовать белый список, а не черный список. Кроме того, вам действительно нужно копировать данные пикселей с изображения, вы уязвимы для злоумышленника, загружающего файл изображения, содержащий встроенный серверный скрипт, если вы просто сохраните файл как есть. – Cheekysoft

+0

@Cheekysoft, также, 'index.php5' (он может существовать) и' index.php.fr' ([согласование контента] (http://httpd.apache.org/docs/current/content-negotiation.html)) – xfix

ответ

1

Ваш скрипт всего на примере место

$imageinfo = getimagesize($_FILES['bf_file'][$key]['tmp_name']); 

Чтобы получить имя температура должна быть $_FILES['bf_file']['tmp_name'][$key], а также размер файла уже вернулся через $_FILES['bf_file']['size'][$key]

Почему бы вам не взглянуть на пример примера по аналогичному вопросу

multi image upload wrong quantity on file-upload

Uploading images with the help of arrays and fetch errors

+0

Должно быть очевидно, что я просто огляделся и схватил эти коды из Интернета и бросил их на свою страницу. Говоря о позиции ключа $, это появляется, потому что есть несколько изображений, которые можно загрузить. Спасибо – crazytrain999

+0

Добро пожаловать. Нажмите на ссылки, которые были приведены в примерах до того, как они были сделаны ... и его очень строгий фрэйр .. у вас не должно быть проблем с настройкой – Baba

1

В первом фрагменте. Ну, getimagesize() действительно возвращает тип MIME (вопреки тому, что говорит Баба), но вы не должны зависеть от него. Можно сделать файл, который в начале выглядит как PNG GIF (любая причина для блокировки PNG?), Но после заголовка <?php dangerous_code(); ?>. Кроме того, я не знаю, что вы пытаетесь с помощью [$key]. Я не знаю, что он делает, и массив выглядит как $_FILES[$form_name][$file_field] (например, $_FILES['file_input']['tmp_size'].Нет третьего поля.Если вы делаете несколько загрузок файлов, а затем посмотрите, что сказал Баба (это очень хакерская функция). Затем PHP не " t есть alert() - вы, вероятно, имели в виду echo.

Во втором фрагменте, я вижу, что вы делаете вещи неправильно. Точка является метасимволом в регулярных выражениях, но в этом случае это не имеет большого значения.Подходы к черным спискам в любом случае ошибочны, поскольку вы не знаете, поддерживает ли ваш сервер .php5 расширение. И даже если это не так, кто-то может злоупотреблять content negotiation в Apache, сделав файл hack.php.fr (Apache считает, что .fr - это язык). Ваш подход является ошибочным - просто дайте PNG-файлы .png расширение независимо от того, какое оригинальное расширение было и так далее.

В третьем примере вы активируете неправильную переменную, но также используете только открытые слова (вы не должны, хотя я знаю, что у вас должны быть константы в верхнем регистре (вопреки тому, что говорит PHP), новички не так опасны, если вы имеют здравый смысл), они экстремально медленны, медленнее, чем обычная строка, и совершают много ошибок, если у вас есть E_NOTICE (подсказка: вы должны)). Далее, continue не для if условностей - это для условных циклов (он также работает на switch (как break), но я думаю, что это просто для согласованности).

Что касается необходимости загрузки файлов, это легко. Просто сделайте условно более isset($_FILES['file_input_name']).

ТЛ; др - Учиться PHP правильно

+0

'так что противоречит тому, что говорит PHP, но это не так опасно если у вас есть здравый смысл »- справедливая точка, но они все еще загромождают ваш журнал ошибок с легко устраняемыми ошибками. – DaveRandom

+0

@DaveRandom: обновлено – xfix

+0

+1 на прояснении мим – Baba

0

Безусловно самый безопасный подход, чтобы ваш веб-сервер от выполнения динамического материала в папках, которые пользователь может загрузить на полностью. Тогда неважно, что они загружают.

Файл .htaccess в каталоге загрузок, содержащий php_flag engine off, предотвратит использование php. В любом случае другие исполняемые файлы должны быть отключены по умолчанию, но вы обязательно должны проверить.

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