BL4CK R4BBIT
21 марта 2021 г. 0:11

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

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

как пример:

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

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

2

Вам это нравится? Поделитесь в социальных сетях!

10
Илья Чичак
  • 21 марта 2021 г. 2:49

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

    Nomad
    • 23 марта 2021 г. 13: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 г. 14:26

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

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

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

        Nomad
        • 23 марта 2021 г. 19:25
        • (ред.)

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

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

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

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

          Илья Чичак
          • 23 марта 2021 г. 21:35
          • (ред.)

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

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

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

            Илья Чичак
            • 23 марта 2021 г. 21:37

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

              Nomad
              • 24 марта 2021 г. 0:19

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

                Илья Чичак
                • 24 марта 2021 г. 2:41

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

                  BL4CK R4BBIT
                  • 24 марта 2021 г. 10:56

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

                    Илья Чичак
                    • 24 марта 2021 г. 14:47

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

                      Комментарии

                      Только авторизованные пользователи могут публиковать комментарии.
                      Пожалуйста, авторизуйтесь или зарегистрируйтесь
                      • Последние комментарии
                      • IscanderChe
                        12 апреля 2025 г. 17:12
                        Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
                      • AK
                        1 апреля 2025 г. 11:41
                        Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
                      • Evgenii Legotckoi
                        9 марта 2025 г. 21:02
                        К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
                      • VP
                        9 марта 2025 г. 16:14
                        Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
                      • ИМ
                        22 ноября 2024 г. 21:51
                        Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…