2013-12-05 5 views
0

Я хотел бы загрузить некоторые файлы с jQuery File Upload, но я хочу, чтобы фильтровать типы файлов с помощью этого кода:Фильтр типа файла для загрузки в ASP.Net Generic Обработчиков

public class file : IHttpHandler 
{ 

    public void ProcessRequest(HttpContext context) 
    { 
      HttpPostedFile postedFile = context.Request.Files["file"]; 
      string extension = Path.GetExtension(postedFile.FileName).ToLower(); 
      string[] validExtensions = { ".jpg", ".jpeg", ".png", ".gif", ".pdf", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pps", ".ppsx" }; 
      if (extension.IndexOf(extension) != -1) 
      { 
         // upload files here 
      } 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 

} 

этот код работает хорошо, но когда я переименовать расширения файлов (например, при переименовании x.exe в x.jpg) указанный код, принять тип файла и начать загрузку файла.

Как я могу справиться с этой проблемой?

+1

Посмотрите эту страницу OWASP для обеспечения безопасности загрузки файлов: https://www.owasp.org/index.php/Unrestricted_File_Upload –

ответ

0

Вы не можете быть абсолютно уверены, что файл имеет тип X или Y (в вашем случае изображение), если вы не попытаетесь открыть опубликованный файл.

Тем не менее, вы можете сделать некоторые испытания против вашего HttpPostedFile

я использую следующий код, чтобы сделать так

bool IsImage(string fileName, string contentType, Stream stream) 
{ 
    if (!LooksLikeAnImage(fileName, contentType)) 
     return false; 
    try { 
     using (Image image = Image.FromStream(stream)) 
      return true; 
    } 
    catch { 
     return false; 
    } 
} 

bool LooksLikeAnImage(string fileName, string contentType) 
{ 
    if (fileName != null) 
    { 
     if (Perceived.GetPerceivedType(fileName).PerceivedType == PerceivedType.Image) 
      return true; 
     string ct = ContentType.GetRegistryContentType(fileName); 
     if (ct != null && ct.StartsWith("image/")) 
      return true; 
    } 
    return contentType != null && contentType.StartsWith("image/"); 
} 

Надеется, что это помогает.

+0

Что вы думаете об этих типах: '. .pdf", ".doc", ".docx" , ".xls", ".xlsx", ".ppt", ".pptx", ".pps", ".ppsx" ' –

+0

Вы можете использовать разные воспринимаемые типы для метода LooksLike http: // msdn. microsoft.com/en-us/library/windows/desktop/cc144150(v=vs.85).aspx – Aymeric

+0

Было ли это тем, над чем вы искали? – Aymeric