gpt4 book ai didi

c# - 验证上传的文件是图像

转载 作者:太空宇宙 更新时间:2023-11-03 21:07:33 27 4
gpt4 key购买 nike

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

This answer看起来很有前途,但它最终使用了 System.Drawing。检查内容类型和扩展名是否足够?


编辑: 接受的答案是我需要的,但我将在这里分享我的实际实现。我在 .NET Core 中执行此操作,但我非常确定相同的代码适用于整个框架。

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,您会认为它是一个有效文件。

图像格式的开头确实有“魔法字节”,您可以使用它来潜在地识别文件实际上是图像。 This Wikipedia entry here has a list of magic numbers you could check against .

另请注意,内容类型可以被欺骗。

所以你有两件事可以做。原始答案中指定的内容类型,结合检查文件的“魔数(Magic Number)”。如果有人真的想上传不是图像的 duff 数据并绕过这两项检查,您可能需要做其他事情。

因此,您可以实现 3 个已知的守卫:

  1. 文件的扩展名在您的白名单中吗? (.jpg/.jpeg/等...)
  2. 内容类型是否与白名单中的条目匹配? (图片/jpeg)
  3. 通过前两步确定文件类型后,魔数(Magic Number)是否也匹配?

关于c# - 验证上传的文件是图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40225736/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com