2010-10-26 102 views
7

我想验证文件类型以确保用户正在上传类型为JPEG,GIF或PNG的图像。因为它检查MIME内容类型,所以不用检查文件扩展名,而是使用HttpPostedFile.ContentType更安全。HttpPostedFile.ContentType是验证上传文件的完美方式吗?

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; 
} 

这是一个无瑕疵的方式来检查文件类型,或可以被愚弄?

回答

6

使用扩展名可能更安全。 ContentType在来自客户端的http请求中发送。如果您测试扩展名,用户可以将exe的扩展名更改为jpg,但它不会以exe的形式运行。

4

使用扩展名和HTTP标头都是同样不可靠的,因为它们都可以轻易伪装,无论是由恶意攻击者使用原始HTTP请求,还是由无辜的浏览器用户挑选错误命名的文件。如果你想确定,你必须打开文件并分析内容,没有别的办法。