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

12 3
Sly32
На сайте с 29.03.2012
Offline
302
456

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

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

filename="154339705_atkritka_1427242866_110.jpg"\r\nContent-Type: image/jpeg\r\n\r\n\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xff\xdb\x00C\x00\x01\x01\x01\x01\x01\x01\x01\x01\x

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

LEOnidUKG
На сайте с 25.11.2006
Online
1723
#1
переименовать же можно.

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

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

Нет, не гарантировано т.к. можно соединять 2 и более файлов в один разного типа.
✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
S
На сайте с 30.09.2016
Offline
469
#2
Sly32 :
Интересно, в бинарном коде файла будет гарантировано его тип или там тоже можно подменить?

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

Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
LEOnidUKG
На сайте с 25.11.2006
Online
1723
#3

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

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

Sly32
На сайте с 29.03.2012
Offline
302
#4
Sitealert #:

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

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

lutskboy
На сайте с 22.11.2013
Offline
171
#5

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

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

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

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

LEOnidUKG
На сайте с 25.11.2006
Online
1723
#7
Sly32 #:

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

Content-Type

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

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

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

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

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

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

Недавняя пугалка про CF7 тому пример. (в данном случае проблема яйца выеденного не стоит, но там описан сам принцип эксплуатации такой уязвимости)
Делаю хорошие сайты хорошим людям. Предпочтение коммерческим направлениям. Связь со мной через http://wp.me/P3YHjQ-3.
L
На сайте с 10.02.2015
Offline
221
#9
БОльшая опасность, когда загрузят *.php файл, который определится как рисунок.
T7
На сайте с 19.09.2018
Offline
63
#10
SeVlad #:
загрузив php-файл c расширением  "jpg" можно  выполнить php-код

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

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


12 3

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий