Как проверить тип загружаемого файла?


Sly32
165

Допустим, у меня на сервере разрешена загрузка пдф и пнг/жпег — как мне убедиться что файл, загружаемый через форму, таковым является? Из форм-дата я забираю filename и проверяю расширение, но это не гарантированно правда, переименовать же можно.

Интересно, в бинарном коде файла будет гарантировано его тип или там тоже можно подменить?

filename="154339705_atkritka_1427242866_110.jpg"rnContent-Type: image/jpegrnrnxffxd8xffxe0x00x10JFIFx00x01x01x00x00x01x00x01x00x00xffxdbx00Cx00x01x01x01x01x01x01x01x01x

Первые байты в Content-Type как формируются?


LEOnidUKG
переименовать же можно.

Ну переименовали вы zip в pdf и загрузили… дальше что с ним делать?

Интересно, в бинарном коде файла будет гарантировано его тип или там тоже можно подменить?

Нет, не гарантировано т.к. можно соединять 2 и более файлов в один разного типа.


Sitealert
Sly32 :
Интересно, в бинарном коде файла будет гарантировано его тип или там тоже можно подменить?

Первые символы, структура файла.
В пхп, например есть функции для определения mime. А если разговор про картинки, так вообще можно определить высоту/ширину – если нет таковых, то отлуп.


LEOnidUKG

В самом мануале, в первом комменте есть отличный пример:

https://www.php.net/manual/ru/features.file-upload.php


Sly32
Sitealert #:

Первые символы, структура файла.
В пхп, например есть функции для определения mime. А если разговор про картинки, так вообще можно определить высоту/ширину – если нет таковых, то отлуп.

Спасибо, оба варианта подходят) в пайтоне тоже есть либы для этого.


lutskboy

для pdf не знаю. а для картинок тот пример не годится. он миме тип определяет. переименуй расширение и загрузка пройдет

для картинок используйте $info = @getimagesize($file);


Sly32
lutskboy #:
для pdf не знаю. а для картинок тот пример не годится. он миме тип определяет. переименуй расширение и загрузка пройдет

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


LEOnidUKG
Sly32 #:

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

Content-Type

Узнаётся не МАГИЧЕСКИМ образом. А вы будете в шоке, а от расширения файла. Дальше идут лишь извращения, как писали выше про размер картинки и т.д.

Опять же, повторюсь, файлы можно скреплять разного типа. Я вам загружу JPG и он будет картинкой на 100%. Далее я переименую файл в zip и это будет архив с файлами 100%


SeVlad
LEOnidUKG #:
Узнаётся не МАГИЧЕСКИМ образом. А вы будете в шоке, а от расширения файла.

Ты будешь в шоке, но

1. Файл опознается по MIME.

2. При определённых настройках сервера подмена расширения может сработать (загрузив php-файл c расширением  «jpg» можно  выполнить php-код) и этот метод — давно известная дыра в безопасности.

Недавняя пугалка про CF7 тому пример. (в данном случае проблема яйца выеденного не стоит, но там описан сам принцип эксплуатации такой уязвимости)


livetv
БОльшая опасность, когда загрузят *.php файл, который определится как рисунок.

timo-71
SeVlad #:
загрузив php-файл c расширением  «jpg» можно  выполнить php-код

Если сервер + кмс более менее настроены для предотвращения этого, то вряд ли.

Но, и проверять надо:

Как проверить тип загружаемого файла?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *