HttpPostedFile.ContentType是一种validation上传文件的完美方式吗?

我想validation文件类型以确保用户正在上传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; } 

这是检查文件类型的完美方式,还是可以被欺骗?

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

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

要可靠地了解内容类型,您可能需要查看内容类型嗅探,例如:

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

这会尝试通过检查前几个字节来确定文件的内容类型。