Соответствующая проверка загрузки файла - PullRequest
0 голосов
/ 15 ноября 2011

Фон

В целевом приложении отслеживания проблем (в django) пользователи могут добавлять вложения файлов во внутренние сообщения.Файлы в основном имеют разные форматы изображений, офисные документы и электронные таблицы (Microsoft или Open Office), PDF и PSD.

Пользовательский тип поля файла (тип расширяющий FileField) в настоящее время проверяет, что файлы не превышают заданный размери что файл content_type находится в MIME-типе приложения «белый список».Но поскольку база пользователей очень разнообразна (многонациональная и мультиплатформенная), нам часто приходится настраивать наш белый список, поскольку пользователи, использующие старые или новые версии приложений, имеют разные типы MIME (даже если они являются действительными файлами и открываются правильнодругие пользователи в компании).

Примечание : файлы не «выполняются» Apache, они просто хранятся (с разрешениями unix 600) и могут быть загружены пользователями.

Вопрос

Какие плюсы и минусы для разных типов валидации?

Несколько вариантов:

  • Белый или черный список MIME-типа
  • Расширение файла во время списка или черного списка
  • Проверка входных данных загрузки файла Django и безопасность даже предлагает "вам действительно нужно прочитать файлчтобы быть уверенным, что это JPEG, а не .EXE "(это даже жизнеспособно, когда допускается принимать файлы разных типов?)

Существует ли« правильный »способ проверки загрузки файлов?

Редактировать

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

Но эти файлы похожи на вложения электронной почты.мы не можем проверить, что каждый PSD является действующим и рабочим изображением Photoshop, то же самое относится и к JPG или любому другому типу.Даже если это именно то, о чем говорится, мы не можем гарантировать, что это полностью функциональный файл.

Итак, на что я надеялся, так это: действительно ли магия файлов абсолютно необходима?Какую защиту это действительно добавляет?И снова белый список типа MIME фактически добавляет какую-либо защиту, чего нет в белом списке расширения файла?Если у файла есть расширение файла CSV, JPG, GIF, DOC, PSD, действительно ли реально проверить, что это то, о чем говорится, даже если само приложение не зависит от файла?

Опасно ли использовать простой белый список расширений файлов, исключая явных нарушителей (EXE, BAT и т. Д.) И, я думаю, запрещать файлы, которые опасны для пользователей?

1 Ответ

0 голосов
/ 15 ноября 2011

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

Э-э, то есть магия . Файлы могут быть идентифицированы первыми несколькими байтами их содержимого. Как правило, он более точен, чем расширения или типы пантомимы, поскольку вы судите, что это за файл, по тому, что он содержит, а не по тому, какой браузер или пользователь объявили его.

Есть статья на FileMagic на вики Python

Вы также можете использовать пакет python-magic

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

Разъяснение

Просто чтобы указать, что использование волшебства для идентификации файла на самом деле означает чтение первого маленького фрагмента файла. Это определенно больше, чем просто проверка расширения, но не слишком сложная работа. Все, что делает волшебство файла, это проверяет, что файл «выглядит» так, как будто это файл, который вы хотите. Это все равно что проверять расширение файла, вы смотрите только первые несколько символов содержимого вместо нескольких последних символов имени файла. Подделать сложнее, чем просто поменять имя файла. Я рекомендовал бы против белого списка типа пантомимы. Белый список расширений файлов должен работать в соответствии с вашими потребностями, просто убедитесь, что вы включили все возможные расширения. В противном случае совершенно корректный файл может быть отклонен только потому, что он заканчивается .jpeg вместо .jpg.

...