в php, как я понял, проверка по MIME тоже отпадает, как быть? можно примеры привести.. ?
Спустя 4 минуты (27.10.2011 - 17:55) Игорь_Vasinsky написал(а):
посмотри статью в моём журнале "Загрузка картинки для определённого юзера"
там всё расписано, с комметами
p/s - если у php или js скрипта поменять расширение (пряча его под расширением картинки) - они не будут испольняться....
а так да - мысль верная - MIME TYPE
там всё расписано, с комметами
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 и думают, что так у них появится картинка!
Типичный пример блондинок, когда у них есть 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
Цитата |
Если бы я писал - то я бы сначала проверил расширение, потом майм тип, а потом и гетимейджсайз до кучи. И только в случае успеха всех 3х - тру. Нету примера под рукой. |
Можете описать ситуацию, в которой проверка расширения и getimagesize() профукают атаку, а проверка mime type их подстрахует?
Спустя 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 еще и элементарно подделать:
|
Не совсем.
Спустя 10 минут, 1 секунда (30.10.2011 - 14:02) Гость_Дмитрий написал(а):
Цитата |
Не совсем. |
Из-за того, что Вы не приводите ни аргументов, ни кода, наша с Вами беседа практически бесполезна для человека, который зайдет в эту тему за информацией
Спустя 53 секунды (30.10.2011 - 14:03) vital написал(а):
Цитата (Гость_Дмитрий @ 30.10.2011 - 13:02) | ||
Из-за того, что Вы не приводите ни аргументов, ни кода, наша с Вами беседа практически бесполезна для человека, который зайдет в эту тему за информацией |
я вообще вредный.
Спустя 9 минут, 28 секунд (30.10.2011 - 14:12) Гость Дмитрий написал(а):
Цитата |
я вообще вредный. |
Спустя 4 минуты, 18 секунд (30.10.2011 - 14:17) vital написал(а):
Цитата (Гость Дмитрий @ 30.10.2011 - 13:12) | ||
|
не совсем.
Спустя 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.
Ну как альтернатива 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) | ||
Вот отрывок статьи про методы взлома 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) Гость_Дмитрий написал(а):
Цитата |
Вы просто уперлись как баран, и смотрите только с одной точки зрения. |
А Вы конечно же не упертый как баран
Цитата |
И сделав все три проверки(майм, расширение, попытка работы с картинкой), и определив ошибки на каждом этапе - можно сказать пользователю что конкретно у него не так. |
Вы либо идиот и не понимаете, что $_FILES['filename']['type'] - это бесполезная фигня в данном случае, либо просто от нечего делать забавляетесь.
Цитата |
Как правило, в серъёзной логике нужны все эти 3 момента. |
Ага, в серьезной
Цитата |
Да, кстати. Про пхп код в картинке. Вы попробуйте. Возьмите картинку, допишите к ней код, и попробуйте запустить, перед тем как такую хуйню постить. Это полный бред. |
К сожалению не пробовал, но в целом статья очень даже адекватная и я сильно сомневаюсь, что автор описал этот момент из-за своего низкого профессионализма.
Спустя 10 минут, 43 секунды (30.10.2011 - 15:41) killer8080 написал(а):
Ну проверять расширения загружаемых файлов - это само собой
Но не стоит анализировать тип через $_FILES
Но не стоит анализировать тип через $_FILES
Цитата (Гость_Дмитрий @ 30.10.2011 - 15:11) |
Злоумышленник берет корректную картинку, приписывает к ней в конец (или в EXIF-данные) php-скрипт, и сервер его исполняет, мы взломаны. |
Интересный момент
Специально попробовал его осуществить, ничего не получилось. Интерпретатор засыпал ошибками, а 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 |
Цитата |
Цитата (Гость_Дмитрий @ 30.10.2011 - 15:11) Злоумышленник берет корректную картинку, приписывает к ней в конец (или в EXIF-данные) php-скрипт, и сервер его исполняет, мы взломаны. Интересный момент Специально попробовал его осуществить, ничего не получилось. Интерпретатор засыпал ошибками, а echo так и не вывел. |
Спасибо, что попробовали.
Понимаете, когда приходитcя, делать форму обратной связи на вменяемом сайте за вменяемый бюджет, где взлом может сильно навонять, то оставлять подобные моменты без внимания, надеясь на форумных гуру типа vital, просто глупо.
Спустя 30 секунд (30.10.2011 - 15:54) Invis1ble написал(а):
! |
Invis1ble |
Спустя 20 минут, 54 секунды (30.10.2011 - 16:15) vital написал(а):
Цитата |
Вы либо идиот и не понимаете, что $_FILES['filename']['type'] - это бесполезная фигня в данном случае, либо просто от нечего делать забавляетесь. |
Представьте себе, есть еще масса других способов проверить майм. Я про этот - вообще не думал. Ни разу и не пользовался..
Цитата |
К сожалению не пробовал, но в целом статья очень даже адекватная и я сильно сомневаюсь, что автор описал этот момент из-за своего низкого профессионализма |
.
А я пробовал. И да, это было рабочим видимо.. Cтрого говоря, у меня получилось выполнить пхп код из картинки, но достаточно геморно. Что забавно, echo там, почему-то, не работает.
А я пробовал. И да, это было рабочим видимо.. Cтрого говоря, у меня получилось выполнить пхп код из картинки, но достаточно геморно. Что забавно, echo там, почему-то, не работает.
Спустя 42 секунды (30.10.2011 - 16:15) killer8080 написал(а):
Гость_Дмитрий
нет, ну на самом деле эту теорию рано считать опровергнутой, возможно если вместо реальной картинки, сделать искусственный бинарник, эмулирующий структуру какого либо графического формата, и при этом не содержащего смертельных, для интерпретатора символов, то может быть ...
PS это мне напомнило уязвимость всеми "любимого" IE6, с обработкой PNG
нет, ну на самом деле эту теорию рано считать опровергнутой, возможно если вместо реальной картинки, сделать искусственный бинарник, эмулирующий структуру какого либо графического формата, и при этом не содержащего смертельных, для интерпретатора символов, то может быть ...
PS это мне напомнило уязвимость всеми "любимого" IE6, с обработкой PNG
Спустя 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) Гость Дмитрий написал(а):
Цитата |
И почему мне эта фраза напоминает попытку померятся сантиметрами? |
Попытка померяться сантиметрами - это практически все Ваши посты, начиная с фразы: обе функции шлак., просто в разных проявлениях.
Цитата |
Поверьте, я куда более круыте проекты делаю, чем "сайты_с_формами_обратной_связи". |
Я рад за Вас
Форма обратной связи с возможностью прикрепить файлы - частный случай, где применяется описанная в этой теме информация.
Спустя 15 минут, 4 секунды Гость Дмитрий написал(а):
Кстати, если есть желание "конструктивно обосрать" мой код, то здесь лежит тема, где я прошу указать на замеченный в моем "скрипте авторизации" дыры.