BL4CK R4BBIT
Наурыз 21, 2021, 12: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, 1: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, 2:26 Т.Қ.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

              Nomad
              • Наурыз 24, 2021, 12:19 Т.Ж.

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

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

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

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

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

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

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

                      Пікірлер

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