определить тип содержания файла (не MIME)

timer0x01

Новичок
определить тип содержания файла (не MIME)

Привет!

У меня вопрос: Как определить тип закаченого (upload) файла по его содержанию, а не по его разширению (mime типу).

Т.е. если я его определяю по $_FILES['userfile']['type'], то он мне въдаёт соответственный MIME тип файла ссълаясь на его разширение и ето определяет браузер.

К примеру у меня есть файл test.php его тип "application/x-php", после того если я его переименую на test.jpg его тип будет "image/jpeg".
Так вот, если мне надо контролировать какие файлы можно загружать на сервер проверят $_FILES['userfile']['type'] неефективно.

Единственный выход есть если мне надо проверят графические форматы файлов, есть функция getimagesize() которая проверяет тим графического файла, определяет она его по содержанию а не по разширению..

А как же быть если мне надо что-бы закачивались только таблицы excel'а (application/vnd.ms-excel) к примеру ? Существует ли вариант проверки файла по его реальному содежанию а НЕ MIME типу ?

ЗАРАНЕЕ СПАСИБО! :)
 

kruglov

Новичок
Определяйте только по расширению.
Сервер не будет выполнять test.php, переименованный в test.jpg
А вот test.jpg, переименованный в test.php - будет.

Насчет excel - вым нужно защититься от дурака или от хакера?
 

Zetruger

ivan.chistyakov.name
timer0x01
у всех не текстовых файлав есть определенная структура
должен быть заголовок, "МАГИЧЕСКОЕ" слово
только на 100% все равно не сделаешь проверку, так что не мучайся и проверяй только по расширению

что касается проверки изображений, то есть интересная история взлома

на сайте была обнаружена локальная php-инклюд уязвимость (без расширения, но с путем)
встала задача загрузить php-shell и проинклюдить
там гостевая была с регистрацией и возожностью загрузить фото

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

вот такая сказочка...
 

timer0x01

Новичок
2 kruglov: и от дурака и от хакера :). В большей степени от хакера ... значит какое разширение то и выполяется ? Ето что не зависит как сервер конфигурирован ? И вообше мне не хочется иметь файлы test.jpg с PHP или каким нибудь другим сорержанием.. никакого варианта нет что ли, только по разширению филтрировать что-ли ? И ещё ети MIME типы немножко различаются для каждого браузера к примеру: image/jpeg (Firefox, Opera) image/pjpeg (IE) ...

-~{}~ 20.07.07 13:57:

2 Zetruger: как же защитится ? Где можно почитать про ету сказку подробней :)
 

Zetruger

ivan.chistyakov.name
timer0x01
защититься просто
1 отключить allow_url_fopen
2 отключить allow_url_include
3 тщательно проверять что мы передаем в функции
include. include_once. require. require_once
(перед вызовом проверяем через is_file)
4 все php-файлы кроме index.php храним вне публичной директории
5 туда же сохраняем и все upload-файлы (в папку для upload на всякий случай можно кинуть .htaccess со строкой php_flag engine off)
6 тотальный контроль входных параметров


а про контроль содержимого upload-файла лучше забыть - к положительному результату не приведет
 

timer0x01

Новичок
Значит я понял так:

Специально для закачки файлов проверять с $_FILES['userfile']['type']. Важное разширения файла, а не его содержание (потому-что веб-сервер его возпримит и "запустит" по его разширению).
Значит если у меня есть test.php с system($_GET['cmd']) и он переименуван в test.jpg или test.xls и закачан на сервер, то test.php не будет работать ? А насчьот Exif как зашитится ? (Exif поддерживается только в TIFF и JPEG, значит не разрешать ети форматы ?)
 

Zetruger

ivan.chistyakov.name
timer0x01
пытаться контролировать теги Exif это уже пароноя!

надо просто внимательно писать проверку перед include. include_once. require. require_once

и не беспокоится о содержимом файлов
 

Anarki

Новичок
А зачем инклудить jpg файлы? :D
А вообще картинки можно определить через getimagesize();
Да и ничего страшного не произойдет если пользователь закачает php файл с расширением jpg, главное не дать ему его переименовать
 

SiMM

Новичок
> А вообще картинки можно определить через getimagesize();
По Вашему файл image.php с кодом

PHP:
GIF89<?php print_r(getimagesize(__FILE__))?>
является картинкой?
 

kvf77

Red Devil
Zetruger
в картинки можно вставлять комментарии и никто не мешает написать в комментарий код на PHP
 

timer0x01

Новичок
Значит вывод такой:

Проверять только по разширению файлов. По содержанию файлов проверять не ефективно ( к примеру проверка картинки функцией getimagesize() легко обойти примером выше ) . После проверки надо именововать файл с "графичиским" раширением к примеру *.jpeg и етого хватит что-бы обезопасить скрипт в етом смысле.
 

Zetruger

ivan.chistyakov.name
timer0x01
ну примерно так, хотя я не говорил что getimagesize не стоит использовать
 

kruglov

Новичок
Проверка getimagesize и mime-type позволит не загрузить такое, что и картинкой не будет. Вам нужны на сайте дырки вместо аватаров? Думать же надо...
 
Сверху