BL4CK R4BBIT
BL4CK R4BBITНаурыз 20, 2021, 2:11 Т.Қ.

Проверка загружаемого файла

Вопрос необходима проверка на формат и тип загружаемого файла. На форумах предлагают использовать FileExtensionValidator

как пример:

from django.core.validators import FileExtensionValidator
class Post(models.Model):
    pdf_file = models.FileField(null=True, blank=True, validators=[FileExtensionValidator(['pdf'])])

Вопрос на сколько это безопасно. Можно же переименовать расширение у любого файла

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

10
Илья Чичак
  • Наурыз 20, 2021, 4:49 Т.Қ.

это не безопасно в любом случае, так что всеравно, какой вариант используется.
я не видел ни одного валидатора, который бы смотрел код бинарника, чтобы проверять, что пришло внутри

    Nomad
    • Наурыз 23, 2021, 3:55 Т.Ж.
    • (өңделген)

    привет

    по поводу вашего вопроса

    если вам необходимо работать с различными форматами файлов, можно посмотреть на python-magic

    https://pypi.org/project/python-magic/

    кроме данной библиотеки попробуйте еше эти 2:

    1. imghdr - https://docs.python.org/3/library/imghdr.html

    2. fleep - https://github.com/floyernick/fleep-py

      Илья Чичак
      • Наурыз 23, 2021, 4:26 Т.Ж.

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

      поэтому, если, условно, если у вас джанга работает в 6 потоков на gunicorn и 6 пользователей грузят файлы (условные 2 Gb каждый), сервис становится недоступен для 7-го

      ну и по памяти можно прилечь - если у вас всего 10Gb памяти, а 6 пользователей одновременно грузит по файлу 2Gb - ничем хорошим это не кончится. файл является inMemory объектом

        Nomad
        • Наурыз 23, 2021, 9:25 Т.Ж.
        • (өңделген)

        в принципе, справедливое ремарка

        Но как идея для обхода данных ограничений можно написать отдельный сервис на питоне (отдельно от джанги) который делает только проверку/сохранение файла для модели основного приложения

        более того можно смотреть в сторону асинхронности

        короче по мне надо пробовать

          Илья Чичак
          • Наурыз 23, 2021, 11:35 Т.Ж.
          • (өңделген)

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

          достаточно красивое решение - грузить фронтом картинку куда-нибудь на s3, а на бэк передавать url (понятно, что здесь никакой проверки не может быть), но с точки зрения нагрузки - все хорошо (+ безопасность можно обеспечить через presigned url, когда для каждого загружаемого файла сначала получается одноразовая ссылка для загрузки с ограничением по размеру). либо, использовать генераторы (тут как минимум по памяти можно не лечь). тоесть, усложно говоря, не ждать весь файл, а получать его кусками. приэтом, если в первом куске определяется не тот тип - сразу прерывать загрузку файла.

          хотя, я работал только со скачиванием через генераторы (вполне успешно). получалось качать несколько 6+ гиговых файлов в несколько потоков на машине с 8 Гб памяти и все не умерло=)

            Илья Чичак
            • Наурыз 23, 2021, 11:37 Т.Ж.

            мне кажется, есть смысл посмотреть какие-то js-ные либы для этого

              Nomad
              • Наурыз 23, 2021, 2:19 Т.Қ.

              js-ные либы - это означает что весь груз положить на плечи фронта?

                Илья Чичак
                • Наурыз 23, 2021, 4:41 Т.Қ.

                конечно. а почему бы и нет?
                клиентов много, бэк один=)

                  BL4CK R4BBIT
                  • Наурыз 24, 2021, 12:56 Т.Ж.

                  Это все супер. Но в моем варианте нужна была просто защита от дурака. Чтобы админ(в моем случаи председатель СНТ) не запихал протокол собрания в формате какого нить ворда или жпега. Сомневаюсь что он да и ограничение по размеру стоит на 10 мб

                    Илья Чичак
                    • Наурыз 24, 2021, 4:47 Т.Ж.

                    я думаю, если у вас нет задачи защищаться прям в круг, достаточно проверять расширение файла и не париться

                      Пікірлер

                      Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                      Кіріңіз немесе Тіркеліңіз
                      Г

                      C++ - Тест 001. Первая программа и типы данных

                      • Нәтиже:66ұпай,
                      • Бағалау ұпайлары-1
                      t

                      C++ - Тест 001. Первая программа и типы данных

                      • Нәтиже:33ұпай,
                      • Бағалау ұпайлары-10
                      t

                      Qt - Тест 001. Сигналы и слоты

                      • Нәтиже:52ұпай,
                      • Бағалау ұпайлары-4
                      Соңғы пікірлер
                      G
                      GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
                      Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
                      d
                      dblas5Шілде 5, 2024, 11:02 Т.Ж.
                      QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                      k
                      kmssrАқп. 8, 2024, 6:43 Т.Қ.
                      Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                      АК
                      Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
                      Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                      Енді форумда талқылаңыз
                      Evgenii Legotckoi
                      Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
                      добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                      F
                      FynjyШілде 22, 2024, 4:15 Т.Ж.
                      при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
                      BlinCT
                      BlinCTМаусым 25, 2024, 1 Т.Ж.
                      Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
                      BlinCT
                      BlinCTМамыр 5, 2024, 5:46 Т.Ж.
                      Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
                      Evgenii Legotckoi
                      Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
                      Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

                      Бізді әлеуметтік желілерде бақылаңыз