如何确保在C#中上传的文件类型

时间:2018-11-04 23:37:04

标签: c# asp.net image security file-upload

我想让用户将图像和视频上传到我的网站。通常,我会检查图像扩展名是否为jpgpng扩展名。但是我通过上传一个外壳来对其进行黑客攻击来测试Web的安全性,因此我将外壳的扩展名更改为.jpg

可悲的是,它已正常上载到主机的文件夹并显示了我的所有文件,因此,如果有人知道在将该文件上载到主机之前,最好先确保该文件是视频或此文件是真实图像, {1}} C#网络表单。

3 个答案:

答案 0 :(得分:1)

您可以验证文件的扩展名。 使用此代码。

   protected void ValidateFile(IFormFile file)
    {
        if (file == null)
            throw new Filters.ApiException(this.Localizer[string.Format(ErrorConst.SelectFile)].Value, 400);
        if (file.Length < 1)
            throw new Filters.ApiException(this.Localizer[string.Format(ErrorConst.ErrorImageSize)].Value, 400);

        int filesize = 3;
        string[] supportedTypes = new[] { "jpg", "jpeg", "png", "bmp" };
        var fileExt = System.IO.Path.GetExtension(file.FileName).Substring(1);
        if (!supportedTypes.Contains(fileExt))
            throw new Filters.ApiException(this.Localizer[ErrorConst.ErrorImageExtension].Value, 400);
        if (file.Length > (filesize * 1024 * 1024))
            throw new Filters.ApiException(this.Localizer[string.Format(ErrorConst.ErrorImageSize, filesize)].Value, 400);
    }

这是经过验证的文件和文件大小。

谢谢。

答案 1 :(得分:1)

我想分享在上传文件之前获取文件类型/内容类型的最简单方法。

            string file_type;
            var provider = new FileExtensionContentTypeProvider();
            if(!provider.TryGetContentType(finlename, out file_type))
            {
                file_type = "application/octet-stream";
            }

答案 2 :(得分:0)

您可以检查文件的内容类型。以下代码可能会有所帮助:

public static readonly string[] mimeTypes = new[] { "image/jpeg", "image/png" };

if (mimeTypes.Contains(fileBox.PostedFile.ContentType))
{ // Do something.    
}

此外,我建议进行客户端验证。这将有助于在发布到服务器之前检查内容类型。这也将有助于节省带宽。

以下链接应为您提供帮助:

How to check file MIME type with javascript before upload?

不仅要使用文件扩展名,还要检查“ image / jpeg,image / png,image / gif”的mime类型。