【问题标题】:how to make sure of the uploaded file type in c#如何在c#中确定上传的文件类型
【发布时间】:2026-01-24 13:25:01
【问题描述】:

我想让用户将图像和视频上传到我的网站。通常我会检查jpgpng 扩展的图像扩展。但是我通过上传一个 shell 来破解它来测试我的 web 的安全性,所以我将 shell 的扩展名更改为.jpg

遗憾的是它已经正常上传到主机的文件夹并显示了我所有的文件,所以如果有人知道最好的方法来确保这个文件是一个视频或者这个文件是一个真实的图像,然后再将它上传到@@的主机987654326@Asp.net 网络表单。

【问题讨论】:

  • 因此您希望允许用户将 jpg 或 png 文件上传到您的网站,但不允许用户上传欺骗性或间接键入或格式化的文件。我的猜测是,您最好的选择是获得一个您信任其代码的图像解析器来尝试加载文件并查看它是否成功。如果您偏执,请将检查分派给具有锁定权限的辅助进程。
  • 查看*.com/questions/58510/… 以获得实际答案。 @Flydog57 的评论也是一种可行的方法,如果它可以解析为图像,它就是图像。

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


【解决方案1】:

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

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类型是要走的路。

【讨论】:

  • 请注意,这不会检查客户端无法设置的任何内容,因此安全值为零。
  • 是的,如果用户将他的hacker文件的扩展名更改为jpeg,它将很容易破解我的服务器,这种方式只查找扩展名,他很容易更改他的文件扩展名
【解决方案2】:

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

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

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

谢谢。

【讨论】:

  • 请注意,这不会检查用户无法设置的任何内容,因此安全价值很小。 (价值不大的原因是,不是 jpg 的恶意软件可能无法与 jpg 扩展名一起使用,但总的来说,这并不确定,尤其是在 Windows 上。)
  • 当然。它只是不安全。 :) 如果文件名以列出的扩展名之一结尾,攻击者可以上传任何类型的文件。这不是最初的问题,它没有提供任何安全价值,因为文件扩展名是由客户端设置的。
  • 正是 Gabor,这就是我要说的。我需要安全的东西,任何人都可以将他的文件扩展名更改为 jpeg 并入侵网络!
  • 就问题而言,这个答案不起作用。
【解决方案3】:

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

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

【讨论】:

    最近更新 更多