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

时间:2010-10-26 00:31:33

标签: c# asp.net image 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;
}

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

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:4)

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

答案 2 :(得分:0)

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

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

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