Является ли HttpPostedFile.ContentType безупречным способом проверки загруженного файла? - PullRequest
7 голосов
/ 26 октября 2010

Я хочу проверить тип файла, чтобы убедиться, что пользователь загружает изображение типа JPEG, GIF или PNG. Вместо того, чтобы проверять расширение файла, я подумал, что использовать HttpPostedFile.ContentType будет безопаснее, поскольку он проверяет тип содержимого MIME.

protected void cvValidateImageType_ServerValidate(object source, ServerValidateEventArgs args)
{
    if (fupImage.HasFile)
    {
        args.IsValid = (fupImage.PostedFile.ContentType.ToLower() == "image/jpg" ||
                        fupImage.PostedFile.ContentType.ToLower() == "image/jpeg" ||
                        fupImage.PostedFile.ContentType.ToLower() == "image/pjpeg" ||
                        fupImage.PostedFile.ContentType.ToLower() == "image/gif" ||
                        fupImage.PostedFile.ContentType.ToLower() == "image/x-png" ||
                        fupImage.PostedFile.ContentType.ToLower() == "image/png");

    }
    else
        args.IsValid = true;
}

Это безупречный способ проверить тип файла или его можно обмануть?

Ответы [ 3 ]

6 голосов
/ 26 октября 2010

Использование расширения, вероятно, безопаснее. ContentType отправляется в запросе http от клиента. Если вы протестируете расширение, пользователь может изменить расширение exe на jpg, но оно не будет работать как exe.

4 голосов
/ 26 октября 2010

Как использование расширения, так и заголовки HTTP одинаково ненадежны, поскольку они оба могут быть легко подделаны, либо злоумышленником, использующим необработанные HTTP-запросы, либо невинным пользователем браузера, выбирающим файл с неправильным именем.Если вы хотите быть уверенным, вы должны открыть файл и проанализировать содержимое, другого пути нет.

0 голосов
/ 26 октября 2010

Чтобы достоверно знать тип содержимого, вы можете захотеть изучить анализ типа содержимого, например:

http://suika.fam.cx/www/markup/html/whatpm/Whatpm/ContentType.html

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

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