В моем веб-приложении (asp.net, С #) я загружаю видеофайл на страницу, но хочу загружать только видео в формате FLV. Как я могу ограничить загрузку других расширенных видео?
Это позволяет кому-то просто переименовать любой файл * .flv и загрузить его. В зависимости от ваших требований вы также можете проверить тип MIME.
Дэвид Гленн,
Разве тип MIME обычно не устанавливается в соответствии с расширением имени файла?
Тило,
@Thilo, вы правы, но расширение можно изменить без изменения типа содержимого mime. Тип mime описывает данные, содержащиеся в файле, поэтому с ним можно обращаться соответствующим образом, см. En.wikipedia.org/wiki/MIME
Марк Дикинсон
2
Нет, лучше проверить содержимое файла. Надо проверить подпись flv.
Марат Фасхиев
Просто чтобы добавить к этому, поскольку это все еще популярный ответ - аргумент типа MIME так же небезопасен, как и расширение, поскольку оба могут быть подделаны. Комбинация обеих проверок, вероятно, является разумным решением, но в конечном итоге, если безопасность является проблемой, должны быть более строгие проверки, например, блокировка неподписанных файлов или выборка контента.
Джеймс
21
Вы можете просто прочитать поток файла
using (var target =newMemoryStream()){
postedFile.InputStream.CopyTo(target);vararray= target.ToArray();}
Первые 5/6 индексов сообщат вам тип файла. В случае FLV это 70, 76, 86, 1, 5 .
Это должно быть оценено выше. Если вы действительно хотите, чтобы ваше приложение работало и данные не являются надежными, вам следует проверить начало.
PRMan
7
На сервере вы можете проверить тип MIME, найти тип flv mime здесь или в Google.
Вы должны проверить, что тип пантомимы
video/x-flv
Если вы, например, использовали FileUpload на C #, вы могли бы сделать
Вы не сможете ограничить тип файла, который пользователь загружает на стороне клиента [*]. Вы сможете сделать это только на стороне сервера. Если пользователь загружает неправильный файл, вы сможете распознать это только после того, как файл будет загружен. Не существует надежного и безопасного способа остановить загрузку пользователем файла любого желаемого формата.
[*] Да, вы можете делать всевозможные хитрые вещи, чтобы определять расширение файла перед началом загрузки, но не полагайтесь на это. Кто-то рано или поздно обойдет это и загрузит все, что им нравится.
Хотя он не может помешать хакеру загружать то, что он хочет, он все же должен проверять на стороне клиента для удобства пользователя. Загрузчики Flash должны иметь возможность проверять тип файла.
Тило
1
В OP не упоминаются загрузчики Flash (то есть «загрузчики, написанные во Flash», а не «загрузчики содержимого Flash»). Вопрос помечен тегами asp.net и C #, и с этими вариантами технологий проверка на стороне клиента ограничена и ее легко обойти. :)
ZombieSheep
Для сайта загрузки видео у него должно быть что-то получше на стороне клиента, чем форма загрузки HTML. Загрузка нескольких МБ без индикатора выполнения - это не весело.
Тило,
хорошо, вы говорите, что проверка на стороне клиента не так уж и хороша, как я могу проверить на стороне сервера Mr. ZombieSheep
Сурья сасидхар
@Thilo - Я не могу с этим согласиться, но вопрос в форме загрузки ASP.net. Решает OP, считает ли он этого достаточно хорошим или нет.
ZombieSheep
2
Вы можете проверить подпись .flv. Вы можете скачать спецификацию здесь:
Нашел альтернативное решение в DotNetPerls, которое мне понравилось больше, потому что оно не требует указания пути. Вот пример, в котором я заполнил массив с помощью специального метода
// This custom method takes a path // and adds all files and folder names to the 'files' arraystring[] files =Utilities.FileList("C:\", "");// Then for each array item...foreach(string f in files){// Here is the important line I used to ommit .DLL files:if(!f.EndsWith(".dll",StringComparison.Ordinal))// then populated a listBox with the array contents
myListBox.Items.Add(f);}
Ответы:
Path.GetExtension
источник
Вы можете просто прочитать поток файла
Первые 5/6 индексов сообщат вам тип файла. В случае FLV это 70, 76, 86, 1, 5 .
если
isAllowed
равно,true
то его FLV.ИЛИ
Прочитать содержимое файла
Первые две / три буквы сообщают вам тип файла.
В случае FLV это "FLV ......"
источник
На сервере вы можете проверить тип MIME, найти тип flv mime здесь или в Google.
Вы должны проверить, что тип пантомимы
Если вы, например, использовали FileUpload на C #, вы могли бы сделать
источник
Я не уверен, что вы этого хотите, но:
Или:
источник
Кроме того, если у вас есть
FileInfo fi
, вы можете просто сделать:и он будет содержать расширение файла (примечание: он будет включать в себя
.
, поэтому результатом вышеуказанного может быть:.jpg
.txt
и так далее ....источник
Вы не сможете ограничить тип файла, который пользователь загружает на стороне клиента [*]. Вы сможете сделать это только на стороне сервера. Если пользователь загружает неправильный файл, вы сможете распознать это только после того, как файл будет загружен. Не существует надежного и безопасного способа остановить загрузку пользователем файла любого желаемого формата.
[*] Да, вы можете делать всевозможные хитрые вещи, чтобы определять расширение файла перед началом загрузки, но не полагайтесь на это. Кто-то рано или поздно обойдет это и загрузит все, что им нравится.
источник
Вы можете проверить подпись .flv. Вы можете скачать спецификацию здесь:
http://www.adobe.com/devnet/flv/
См. Главу «Заголовок FLV».
источник
EndsWith ()
Нашел альтернативное решение в DotNetPerls, которое мне понравилось больше, потому что оно не требует указания пути. Вот пример, в котором я заполнил массив с помощью специального метода
источник
Вышеупомянутый метод отлично работает с Firefox и IE, я могу просматривать все типы файлов, такие как zip, txt, xls, xlsx, doc, docx, jpg, png.
но когда я пытаюсь найти расширение файла из googlechrome, мне не удалось.
источник
Стоит упомянуть, как удалить расширение также параллельно с получением расширения:
источник
Это решение также помогает в случаях, когда используется более одного расширения, например Avishay.student.DB.
источник