Как принимать файлы с указанным типом контента в операционной системе - PullRequest
3 голосов
/ 21 марта 2012

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

   if (upload1.HasFile)
      {
       Finfo = new FileInfo(upload1.PostedFile.FileName);
       if (Finfo.Extension.ToLower() == ".docx" || Finfo.Extension.ToLower() == ".doc" || Finfo.Extension.ToLower() == ".xls" ||
                            Finfo.Extension.ToLower() == ".xlsx" || Finfo.Extension.ToLower() == ".pdf" || Finfo.Extension.ToLower() == ".jpg" ||
                            Finfo.Extension.ToLower() == ".png" || Finfo.Extension.ToLower() == ".gif" || Finfo.Extension.ToLower() == ".txt" ||
                            Finfo.Extension.ToLower() == ".mp4" || Finfo.Extension.ToLower() == "ppt" || Finfo.Extension.ToLower() == ".bmp" ||
                            Finfo.Extension.ToLower() == ".swf" || Finfo.Extension.ToLower() == ".rm" || Finfo.Extension.ToLower() == ".pptx")
        {
           // Accept File 
        }
}

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

if (
        upload1.PostedFile.ContentType == "text/rtf" ||
        upload1.PostedFile.ContentType == "application/doc" ||
        upload1.PostedFile.ContentType == "appl/text" ||
        upload1.PostedFile.ContentType == "application/vnd.msword" ||
        upload1.PostedFile.ContentType == "application/vnd.ms-word" ||
        upload1.PostedFile.ContentType == "application/winword" ||
        upload1.PostedFile.ContentType == "application/word" ||
        upload1.PostedFile.ContentType == "application/msword" ||       
        upload1.PostedFile.ContentType == "application/x-msw6" ||
        upload1.PostedFile.ContentType == "application/x-msword" ||
        upload1.PostedFile.ContentType == "application/pdf" ||
                        FileUpload1.PostedFile.ContentType == "application/x-pdf" ||
        upload1.PostedFile.ContentType == "application/vnd.openxmlformats-officedocument.wordprocessingml.document" ||
        upload1.PostedFile.ContentType == "application/vnd.openxmlformats-officedocument.wordprocessingml.template"
        )

, это хороший способ принимать файлы от пользователей.Мне нужно разрешить все файлы, кроме EXE, DMG, DLL, CS, SQL, BAT,.Как я могу гарантировать, что он будет работать во всех операционных системах.

  • Пользователь Apple может использовать OpenOffice или некоторые другие программы для загрузки.поэтому нам нужно разрешить этот тип файла также

Может кто-нибудь сказать мне, как справиться с этими ситуациями

Ответы [ 8 ]

2 голосов
/ 31 марта 2012

Тип содержимого в основном определяется клиентом, но в основном клиент может не отправлять тип содержимого, в этом случае проверка расширения является лучшим способом проверки типа файла. Или вы должны проверить оба. Мы столкнулись с проблемой с некоторыми клиентами Mac, которые не отправляли тип контента.

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

Тип контента - плохая идея, потому что если у пользователя не установлено соответствующее программное обеспечение, ОС отправит неверный тип контента.

1 голос
/ 29 марта 2012

Когда они загружают файл, они должны быть доступны сразу? В прошлом я занимался размещением их в ожидающей папке на сервере, а затем через определенный промежуток времени (хотя это может быть вызванная функция после загрузки). Я запускаю небольшой процесс, который считывает первые несколько байтов данных. Большинство файлов этих типов имеют запись заголовка, часто в виде простого текста, например, PDF имеет «% PDF» в качестве первых 4 символов. Исполняемые файлы часто начинаются с символов "MZ". Загляните в шестнадцатеричный редактор (например, TextPad будет работать). Это, конечно, ваш последний порт захода, ваша сеть безопасности, первые шаги - ограничение суффиксом, как вы делаете (хотя это не является реальной гарантией содержимого файла). Вы также можете использовать типы MIME для блокировки определенных типов Mime Type List , что также поможет. см. здесь, например: http://forums.asp.net/p/1554764/3829242.aspx

Редактировать: обратите внимание, что некоторые из тех файлов, которые вы хотите пропустить, это просто текстовые файлы: .bat и .cs, например. Таким образом, MIME Types или чтение начала данных не помогут - лучший способ - либо запретить эти расширения вообще, либо переименовать расширения в .txt при сохранении на сервере. Они могут не навредить как текстовые файлы с расширением .txt, как они будут; не может быть исполняемым - вам также нужно учитывать .reg тоже догадываться.

0 голосов
/ 27 ноября 2013

«Мне нужно разрешить все файлы, кроме EXE, DMG, DLL, CS, SQL, BAT. Как мне убедиться, что он будет работать во всех операционных системах.»

Я бы использовал расширение файла в качестве первой строки защиты, затем тип контента, затем подпись файла. Попробуйте использовать вложенный оператор if на три уровня, чтобы файл прошел весь путь до конца.

Для этого кода:

if (Finfo.Extension.ToLower() == ".docx" || Finfo.Extension.ToLower() == ".doc" || Finfo.Extension.ToLower() == ".xls" ||.....

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

if (Finfo.Extension.ToLower() != ".exe" && !Finfo.Extension.ToLower() != ".dmg" && !Finfo.Extension.ToLower() != ".dll" &&.......etc

Это сэкономит вам некоторый код, особенно если список приема не конечен и не мал. Подумайте о парне, которому, возможно, придется внести изменения в ваш код позже .... может быть, вы: *)

0 голосов
/ 03 апреля 2012

Вы проверили этот ответ Используя .NET, как вы можете найти тип MIME файла на основе сигнатуры файла, а не расширения ?

Получение типа MIME из файлавозможно со стороны сервера и черный список нежелательных.

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

0 голосов
/ 03 апреля 2012

я использовал расширение файла и даже проверку типа содержания. наряду с тем, что мы запрещаем пользователям загружать документы, отличные от офисных, даже мы пытаемся использовать элементы управления Telerik Upload для достижения функциональности. Еще раз спасибо за всех, кто дал ответы.

0 голосов
/ 31 марта 2012

Вы не должны принимать все типы файлов - это огромная дыра в безопасности.

Я подозреваю, что вашей проблемой может быть ошибка пользователя. Можете ли вы проверить, что у пользователя 'mac' нет открытого файла во время его загрузки? Нет причин, по которым загрузка с Mac должна вести себя иначе, чем с ПК.

У нас аналогичное требование, и мы используем тип данных и расширение имени файла, чтобы определить, что загружается. У нас нет проблем с Mac, PC, Linux или другими.

0 голосов
/ 29 марта 2012

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

Я бы порекомендовал вам запустить какой-нибудь антивирусный веб-сервис или выполнить сканирование, прежде чем принимать файлы, например http://www.opswat.com/products/metascan

0 голосов
/ 21 марта 2012

Лучший способ сделать это - использовать компонент FileOpenDialog, чтобы позволить пользователю аккуратно выбирать файл, добавляя фильтры к компоненту (например, "* .swf | swf files").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...