我想验证文件类型以确保用户正在上传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;
}
这是检查文件类型的完美方式,还是可以被愚弄?
答案 0 :(得分:6)
使用扩展程序可能更安全。 ContentType在来自客户端的http请求中发送。如果您测试扩展,用户可以将exe的扩展名更改为jpg,但它不会作为exe运行。
答案 1 :(得分:4)
使用扩展名和HTTP标头同样不可靠,因为它们都可以轻易伪造,无论是恶意攻击者使用原始HTTP请求,还是无辜浏览器用户选择错误命名的文件。如果你想确定,你必须打开文件并分析内容,没有别的办法。
答案 2 :(得分:0)
要可靠地了解内容类型,您可能需要查看内容类型嗅探,例如:
http://suika.fam.cx/www/markup/html/whatpm/Whatpm/ContentType.html
这会尝试通过检查前几个字节来确定文件的内容类型。