[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: проверка на расширение
zeromind
как правильно написать безопасный скрипт для обработчика php (загрузки картинок), закачиваю их через SWFupload, там в js'e по расширение можно отобрать их - file_types : "*.jpg; *.png; *.jpeg; *.gif", но это естественно ни о чем.. можно легко поменять у файла расширение и закачать его..
в php, как я понял, проверка по MIME тоже отпадает, как быть? можно примеры привести.. ?



Спустя 4 минуты (27.10.2011 - 17:55) Игорь_Vasinsky написал(а):
посмотри статью в моём журнале "Загрузка картинки для определённого юзера"

там всё расписано, с комметами wink.gif

p/s - если у php или js скрипта поменять расширение (пряча его под расширением картинки) - они не будут испольняться....

а так да - мысль верная - MIME TYPE

Спустя 27 минут, 19 секунд (27.10.2011 - 18:23) Winston написал(а):
Только getimagesize() поможет определить изображение.

Спустя 2 дня, 10 часов, 57 минут, 29 секунд (30.10.2011 - 05:20) Гость_Дмитрий написал(а):

$ext = array("jpg", "jpeg", "bmp", "png");
$img_type = isset($_FILES['img']['type']) ? str_replace("image/x-", "", $_FILES['img']['type']) : null;
if(!in_array($img_type, $ext))
$error[] = "Разрешено загружать картинки в формате JPG, JPEG, BMP, PNG<br />";

Это фрагмент из статьи, которую предлагает Игорь_Vasinsky.
Если у пользователя браузер IE, то вышеуказанный код бессмысленный, так как у ослика свои нюансы с MIME-типами. Но не это главное, а главное, что здесь дыра в безопасности!

Цитата
а так да - мысль верная - MIME TYPE

Нет! Функция ниже намного более безопасный и надежный метод проверки типа загружаемого файла.

function getExtension($filename) {
$pathInfoParts = pathinfo($filename);
$extension = mb_strtolower(trim($pathInfoParts['extension']), 'UTF-8');
$basename = mb_strtolower(trim($pathInfoParts['basename']), 'UTF-8');

//Защита от загрузки .htaccess и подобных
if ($basename != ".$extension" && mb_strlen($extension, 'UTF-8')) {
return $extension;
} else {
return 'txt';
}

}


Спустя 7 часов, 27 минут, 48 секунд (30.10.2011 - 12:48) vital написал(а):
обе функции шлак.

Спустя 27 минут, 26 секунд (30.10.2011 - 13:15) Гость_Дмитрий написал(а):
Цитата
обе функции шлак.

Предложите, пожалуйста, более надежный вариант, чем функция, которую я написал. Я с удовольствием буду использовать Ваш вариант, если он действительно превосходит по надежности мой.

Спустя 3 минуты, 20 секунд (30.10.2011 - 13:19) imbalance_hero написал(а):
getimagesize - позволяет узнать ширину и высоту картинки, если данный файл является картинкой, а не переименованный файл и вручную выставленное расширение .jpg .
Типичный пример блондинок, когда у них есть avi, а они хотят сделать скрин-шот, тогда переименовывают файл: sumerki.avi в sumerki.jpg и думают, что так у них появится картинка!

Спустя 4 минуты, 15 секунд (30.10.2011 - 13:23) vital написал(а):
Цитата (Гость_Дмитрий @ 30.10.2011 - 12:15)
Цитата
обе функции шлак.

Предложите, пожалуйста, более надежный вариант, чем функция, которую я написал. Я с удовольствием буду использовать Ваш вариант, если он действительно превосходит по надежности мой.

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

Спустя 12 минут, 56 секунд (30.10.2011 - 13:36) Guest написал(а):
Цитата
Ваша фнукция не делает ничего, кроме как возвращает расширение.

Вы наверное не обратили внимание, что функция называется getExtension smile.gif
Цитата
Если бы я писал - то я бы сначала проверил расширение, потом майм тип, а потом и гетимейджсайз до кучи. И только в случае успеха всех 3х - тру. Нету примера под рукой.

Можете описать ситуацию, в которой проверка расширения и getimagesize() профукают атаку, а проверка mime type их подстрахует? smile.gif

Спустя 1 минута, 29 секунд (30.10.2011 - 13:37) imbalance_hero написал(а):
Guest
А выше ситуации про блондинок было мало?

Спустя 2 минуты, 37 секунд (30.10.2011 - 13:40) vital написал(а):
Цитата

Можете описать ситуацию, в которой проверка расширения и getimagesize() профукают атаку, а проверка mime type их подстрахует? smile.gif

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

Спустя 2 минуты, 2 секунды (30.10.2011 - 13:42) Гость_Дмитрий написал(а):
Цитата
А выше ситуации про блондинок было мало?

Если Вы это написали серьезно, то объсяните, пожалуйста, почему "ситуация про блондинок" обойдет getimagesize(), но запорется на mime type ?

Спустя 1 минута, 37 секунд (30.10.2011 - 13:44) vital написал(а):
Цитата (Гость_Дмитрий @ 30.10.2011 - 12:42)
Цитата
А выше ситуации про блондинок было мало?

Если Вы это написали серьезно, то объсяните, пожалуйста, почему "ситуация про блондинок" обойдет getimagesize(), но запорется на mime type ?

Она запорится на обоих проверках.

Спустя 6 минут, 47 секунд (30.10.2011 - 13:50) Guest написал(а):
Цитата
Она запорится на обоих проверках.

Ну вот! А проверять и mime type, и getimagesize() - это тоже самое, что писать такой код, как ниже, за исключением того, что mime type еще и элементарно подделать:

if(!empty($var) && $var != '') {
...
}


Спустя 1 минута, 32 секунды (30.10.2011 - 13:52) vital написал(а):
Цитата (Guest @ 30.10.2011 - 12:50)
Цитата
Она запорится на обоих проверках.

Ну вот! А проверять и mime type, и getimagesize() - это тоже самое, что писать такой код, как ниже, за исключением того, что mime type еще и элементарно подделать:

if(!empty($var) && $var != '') {
...
}

Не совсем.

Спустя 10 минут, 1 секунда (30.10.2011 - 14:02) Гость_Дмитрий написал(а):
Цитата
Не совсем.

Из-за того, что Вы не приводите ни аргументов, ни кода, наша с Вами беседа практически бесполезна для человека, который зайдет в эту тему за информацией smile.gif

Спустя 53 секунды (30.10.2011 - 14:03) vital написал(а):
Цитата (Гость_Дмитрий @ 30.10.2011 - 13:02)
Цитата
Не совсем.

Из-за того, что Вы не приводите ни аргументов, ни кода, наша с Вами беседа практически бесполезна для человека, который зайдет в эту тему за информацией smile.gif

я вообще вредный.

Спустя 9 минут, 28 секунд (30.10.2011 - 14:12) Гость Дмитрий написал(а):
Цитата
я вообще вредный.

user posted image
smile.gif

Спустя 4 минуты, 18 секунд (30.10.2011 - 14:17) vital написал(а):
Цитата (Гость Дмитрий @ 30.10.2011 - 13:12)
Цитата
я вообще вредный.

user posted image
smile.gif

не совсем.

Спустя 33 минуты, 56 секунд (30.10.2011 - 14:50) Гость Дмитрий написал(а):
Цитата
Не совсем.

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

Спустя 7 минут, 4 секунды (30.10.2011 - 14:58) killer8080 написал(а):
Winston показал единственно правильный метод проверки. Если не ошибаюсь, $_FILES['name']['type'] берётся из http заголовка, а посему легко может быть подделан. Функция getimagesize() анализирует непосредственно структуру файла, потому майм тип, если он необходим, нужно брать из неё.
Ну как альтернатива mime_content_type(), правда она объявлена deprecated.

Спустя 13 минут, 44 секунды (30.10.2011 - 15:11) Гость_Дмитрий написал(а):
Цитата
Winston показал единственно правильный метод проверки

Вот отрывок статьи про методы взлома http://www.captcha.ru/articles/antihack/

Также встречается идея пытаться читать файл изображения функциями getimagesize или imаgecreatefromjpeg. Однако тип файла здесь определяется на основе содержания, так что правильное JPEG-изображение, сохраненное с расширением .php, будет определено как image/jpeg. А называться будет xxxxx.php. Веб-сервер же, принимающий решение об обработчике (handler) для того или иного файла, смотрит именно на расширение. Злоумышленник берет корректную картинку, приписывает к ней в конец (или в EXIF-данные) php-скрипт, и сервер его исполняет, мы взломаны.

Таким образом, контролировать для обеспечения безопасности следует именно расширение файла, а проверки через определение mime-type и через попытку открыть файл функцией getimagesize имеют смысл только для контроля того, что вместо картинки не будет загружен мусор, безвредный, но картинкой не являющийся.

Спустя 10 минут, 5 секунд (30.10.2011 - 15:21) vital написал(а):
Цитата (Гость_Дмитрий @ 30.10.2011 - 14:11)
Цитата
Winston показал единственно правильный метод проверки

Вот отрывок статьи про методы взлома http://www.captcha.ru/articles/antihack/

Также встречается идея пытаться читать файл изображения функциями getimagesize или imаgecreatefromjpeg. Однако тип файла здесь определяется на основе содержания, так что правильное JPEG-изображение, сохраненное с расширением .php, будет определено как image/jpeg. А называться будет xxxxx.php. Веб-сервер же, принимающий решение об обработчике (handler) для того или иного файла, смотрит именно на расширение. Злоумышленник берет корректную картинку, приписывает к ней в конец (или в EXIF-данные) php-скрипт, и сервер его исполняет, мы взломаны.

Таким образом, контролировать для обеспечения безопасности следует именно расширение файла, а проверки через определение mime-type и через попытку открыть файл функцией getimagesize имеют смысл только для контроля того, что вместо картинки не будет загружен мусор, безвредный, но картинкой не являющийся.

Вы просто уперлись как баран, и смотрите только с одной точки зрения.
Помимо обеспечения безопасности еще нужно еще давать фидбек пользователю.
И сделав все три проверки(майм, расширение, попытка работы с картинкой), и определив ошибки на каждом этапе - можно сказать пользователю что конкретно у него не так.
Как и решить, например, что если просто неверное расширение - то промолчать и все-равно использовать файл. Как правило, в серъёзной логике нужны все эти 3 момента.

Да, кстати. Про пхп код в картинке. Вы попробуйте. Возьмите картинку, допишите к ней код, и попробуйте запустить, перед тем как такую <вырезано цензурой - Invis1ble> постить. Это полный бред. Допускаю, что это было акутально лет 5 назад, но не сейчас.

Спустя 2 минуты, 50 секунд (30.10.2011 - 15:24) vital написал(а):
Цитата
Таким образом, контролировать для обеспечения безопасности следует именно расширение файла, а проверки через определение mime-type и через попытку открыть файл функцией getimagesize имеют смысл только для контроля того, что вместо картинки не будет загружен мусор, безвредный, но картинкой не являющийся.

Собственно тут и написано, почему в том числе надо делать все 3 проверки.

Спустя 6 минут, 13 секунд (30.10.2011 - 15:30) Гость_Дмитрий написал(а):
Цитата
Вы просто уперлись как баран, и смотрите только с одной точки зрения.

А Вы конечно же не упертый как баран biggrin.gif
Цитата
И сделав все три проверки(майм, расширение, попытка работы с картинкой), и определив ошибки на каждом этапе - можно сказать пользователю что конкретно у него не так.

Вы либо идиот и не понимаете, что $_FILES['filename']['type'] - это бесполезная фигня в данном случае, либо просто от нечего делать забавляетесь.
Цитата
Как правило, в серъёзной логике нужны все эти 3 момента.

Ага, в серьезной biggrin.gif
Цитата
Да, кстати. Про пхп код в картинке. Вы попробуйте. Возьмите картинку, допишите к ней код, и попробуйте запустить, перед тем как такую хуйню постить. Это полный бред.

К сожалению не пробовал, но в целом статья очень даже адекватная и я сильно сомневаюсь, что автор описал этот момент из-за своего низкого профессионализма.

Спустя 10 минут, 43 секунды (30.10.2011 - 15:41) killer8080 написал(а):
Ну проверять расширения загружаемых файлов - это само собой user posted image
Но не стоит анализировать тип через $_FILES
Цитата (Гость_Дмитрий @ 30.10.2011 - 15:11)
Злоумышленник берет корректную картинку, приписывает к ней в конец (или в EXIF-данные) php-скрипт, и сервер его исполняет, мы взломаны.

Интересный момент user posted image

Специально попробовал его осуществить, ничего не получилось. Интерпретатор засыпал ошибками, а echo так и не вывел.
Warning: Unexpected character in input: ' in W:\home\site.ru\www\test\opera.php on line 322

Parse error: syntax error, unexpected T_STRING in W:\home\site.ru\www\test\opera.php on line 322

Спустя 12 минут, 5 секунд (30.10.2011 - 15:53) Гость_Дмитрий написал(а):
Цитата
Ну проверять расширения загружаемых файлов - это само собой 
Но не стоит анализировать тип через $_FILES

wink.gif
Цитата

Цитата (Гость_Дмитрий @ 30.10.2011 - 15:11)
Злоумышленник берет корректную картинку, приписывает к ней в конец (или в EXIF-данные) php-скрипт, и сервер его исполняет, мы взломаны.

Интересный момент 

Специально попробовал его осуществить, ничего не получилось. Интерпретатор засыпал ошибками, а echo так и не вывел.

Спасибо, что попробовали.
Понимаете, когда приходитcя, делать форму обратной связи на вменяемом сайте за вменяемый бюджет, где взлом может сильно навонять, то оставлять подобные моменты без внимания, надеясь на форумных гуру типа vital, просто глупо.

Спустя 30 секунд (30.10.2011 - 15:54) Invis1ble написал(а):

 ! 

М

Уважаемые участники дискуссии, в частности vital и Дмитрий! За вами конечно любопытно наблюдать, но советую умерить свой пыл и не переходить на личности!
Спасибо за внимание.
Invis1ble

Спустя 20 минут, 54 секунды (30.10.2011 - 16:15) vital написал(а):
Цитата
Вы либо идиот и не понимаете, что $_FILES['filename']['type'] - это бесполезная фигня в данном случае, либо просто от нечего делать забавляетесь.

Представьте себе, есть еще масса других способов проверить майм. Я про этот - вообще не думал. Ни разу и не пользовался..

Цитата
К сожалению не пробовал, но в целом статья очень даже адекватная и я сильно сомневаюсь, что автор описал этот момент из-за своего низкого профессионализма
.
А я пробовал. И да, это было рабочим видимо.. Cтрого говоря, у меня получилось выполнить пхп код из картинки, но достаточно геморно. Что забавно, echo там, почему-то, не работает.

Спустя 42 секунды (30.10.2011 - 16:15) killer8080 написал(а):
Гость_Дмитрий
нет, ну на самом деле эту теорию рано считать опровергнутой, возможно если вместо реальной картинки, сделать искусственный бинарник, эмулирующий структуру какого либо графического формата, и при этом не содержащего смертельных, для интерпретатора символов, то может быть ... smile.gif

PS это мне напомнило уязвимость всеми "любимого" IE6, с обработкой PNG rolleyes.gif

Спустя 1 минута, 3 секунды (30.10.2011 - 16:16) killer8080 написал(а):
Цитата (vital @ 30.10.2011 - 16:15)
А я пробовал. И да, это было рабочим видимо.. Cтрого говоря, у меня получилось выполнить пхп код из картинки, но достаточно геморно. Что забавно, echo там, почему-то, не работает.

а какой формат картинки пробовал?

Спустя 41 секунда (30.10.2011 - 16:17) vital написал(а):
Цитата
делать форму обратной связи на вменяемом сайте за вменяемый бюджет

И почему мне эта фраза напоминает попытку померятся сантиметрами?
Поверьте, я куда более круыте проекты делаю, чем "сайты_с_формами_обратной_связи".

Спустя 14 минут, 44 секунды (30.10.2011 - 16:32) Гость Дмитрий написал(а):
Цитата
И почему мне эта фраза напоминает попытку померятся сантиметрами?

Попытка померяться сантиметрами - это практически все Ваши посты, начиная с фразы: обе функции шлак., просто в разных проявлениях.
Цитата
Поверьте, я куда более круыте проекты делаю, чем "сайты_с_формами_обратной_связи".

Я рад за Вас smile.gif
Форма обратной связи с возможностью прикрепить файлы - частный случай, где применяется описанная в этой теме информация.




Спустя 15 минут, 4 секунды Гость Дмитрий написал(а):
Кстати, если есть желание "конструктивно обосрать" мой код, то здесь лежит тема, где я прошу указать на замеченный в моем "скрипте авторизации" дыры.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.