C# 验证上载的文件是否为图像

C# 验证上载的文件是否为图像,c#,image,upload,.net-core,C#,Image,Upload,.net Core,我将在.NETCore1.0.1的新网站上接受用户上传。我只想允许图像,但是,不只是任何文件。如何在.NET Core中执行此验证?是否可以不使用系统图,因为它没有实现 看起来很有希望,但它最终使用System.Drawing。检查内容类型和扩展是否足够 编辑:接受的答案是我所需要的,但我将在这里分享我的实际实现。我是在.NETCore中完成这项工作的,但我非常确定相同的代码在整个框架中都能工作 static bool IsJpeg(Stream stream) { using (var

我将在.NETCore1.0.1的新网站上接受用户上传。我只想允许图像,但是,不只是任何文件。如何在.NET Core中执行此验证?是否可以不使用系统图,因为它没有实现


看起来很有希望,但它最终使用System.Drawing。检查内容类型和扩展是否足够

编辑:接受的答案是我所需要的,但我将在这里分享我的实际实现。我是在.NETCore中完成这项工作的,但我非常确定相同的代码在整个框架中都能工作

static bool IsJpeg(Stream stream)
{
    using (var br = new BinaryReader(stream))
    {
        var soi = br.ReadUInt16();
        var marker = br.ReadUInt16();
        return soi == 0xd8ff && (marker & 0xe0ff) == 0xe0ff;
    }
}

static bool IsPng(Stream stream)
{
    using (var br = new BinaryReader(stream))
    {
        var soi = br.ReadUInt64();
        return soi == 0x0a1a0a0d474e5089;
    }
}

static bool IsGif(Stream stream)
{
    using (var br = new BinaryReader(stream))
    {
        var soi = br.ReadUInt32();
        var p2 = br.ReadUInt16();

        return soi == 0x38464947 && (p2 == 0x6137 || p2 == 0x6139);
    }
}

仅仅检查文件扩展名是不够的。我可以创建一个ZIP文件,然后将扩展名重命名为.jpg,您可以假设它是一个有效的文件

图像格式的开头确实有神奇的字节,可以用来潜在地识别文件实际上是图像

还请注意,内容类型可能是伪造的

所以你有两件事可以做。原始答案中指定的内容类型,并结合检查文件的幻数。如果有人真的想上传非图像的无用数据,并且绕过了这两个检查,那么您可能需要做一些其他的事情

因此,您可以实现3个已知的防护:

该文件在您的白名单上有扩展名吗。jpg/.jpeg/等。。。 内容类型是否与白名单上的条目匹配?图像/jpeg 一旦通过前两个步骤确定了它是哪种类型的文件,魔法数字是否也匹配?
仅仅检查文件扩展名是不够的。我可以创建一个ZIP文件,然后将扩展名重命名为.jpg,您可以假设它是一个有效的文件

图像格式的开头确实有神奇的字节,可以用来潜在地识别文件实际上是图像

还请注意,内容类型可能是伪造的

所以你有两件事可以做。原始答案中指定的内容类型,并结合检查文件的幻数。如果有人真的想上传非图像的无用数据,并且绕过了这两个检查,那么您可能需要做一些其他的事情

因此,您可以实现3个已知的防护:

该文件在您的白名单上有扩展名吗。jpg/.jpeg/等。。。 内容类型是否与白名单上的条目匹配?图像/jpeg 一旦通过前两个步骤确定了它是哪种类型的文件,魔法数字是否也匹配?
检查内容类型和扩展是否足够你想解决或避免什么问题?我可以将virus.exe重命名为normalPicture.jpg并将其上载到您的站点,检查扩展名不会停止这一操作,我不知道是什么设置了内容类型,无论设置了什么,它可能也只是查看扩展名,而不读取文件来确定它。检查内容类型和扩展名是否足够你想解决或避免什么问题?我可以将virus.exe重命名为normalPicture.jpg并将其上载到您的站点,检查扩展名不会停止这一操作,我不知道是什么设置了内容类型,无论设置了什么,它可能也只查看扩展名,而不读取文件来确定它。这非常完美。谢谢大家!@vaindil由于没有绘图类,您是否能够将此应用于ASP.NET Core?你能分享你的成就吗?Thanks@ZainAlabdinTawfiq我只是将我的实现添加到问题本身。这太完美了。谢谢大家!@vaindil由于没有绘图类,您是否能够将此应用于ASP.NET Core?你能分享你的成就吗?Thanks@ZainAlabdinTawfiq我只是将我的实现添加到问题本身。