【问题标题】:Determine if file is svg确定文件是否为 svg
【发布时间】:2021-02-15 17:37:20
【问题描述】:

尝试通过查看前几个字节来验证文件是否为 svg。我知道我可以对 png 和其他图像文件类型执行此操作,但是 svg 呢?

也许我必须将字节转换为字符串并使用正则表达式进行验证?

【问题讨论】:

  • SGV 文件不仅仅是任何旧的常规图像文件。为什么您处于不知道或不信任文件类型的情况?
  • 我需要实现服务端逻辑,确保客户上传的文件是svg文件。
  • 希望您正确处理 svg 文件;如果您知道我的意思,请不要为执行某些脚本留出任何空间……更具体地说,您尝试了什么,什么不起作用?
  • 如果您允许用户上传 SVG,请注意潜在的 XSS 攻击:ghostlulz.com/xss-svg

标签: c# image svg


【解决方案1】:

如果关注性能并且您不想读取所有 SVG 文件内容,可以使用 XmlReader 类查看第一个元素:

private static bool IsSvgFile(Stream fileStream)
{
    try
    {
        using (var xmlReader = XmlReader.Create(fileStream))
        {
            return xmlReader.MoveToContent() == XmlNodeType.Element && "svg".Equals(xmlReader.Name, StringComparison.OrdinalIgnoreCase);
        }
    }
    catch
    {
        return false;
    }
}

【讨论】:

    【解决方案2】:

    如果您不想使用 XML 解析器(您可能不想),那么我认为 99%+ 可靠的方法是读取第一个,比如 256 个字节。然后检查字符串"<svg ",或者使用正则表达式/^<svg /gm

    和/或检查字符串" xmlns=\"http://www.w3.org/2000/svg\""

    根据我使用 SVG 的经验,这可以捕获几乎所有 SVG 文件,并且几乎没有误报。

    【讨论】:

      【解决方案3】:

      您可以使用流检索文件,并且知道 SVG 格式是 XML,您可以像这样简单地检查它:

      var text = Encoding.UTF8.GetString(img);
      isSvg = text.StartsWith("<?xml ") || text.StartsWith("<svg ");
      

      【讨论】:

      • 这也将允许常规的 xml 文件。不确定它有多重要。
      • 是的,你的权利,如果这种情况下可以简单地评估这部分: text.StartsWith("
      • 请注意,您正在将整个文件加载到内存中,并且只要求查看第一个字节。
      • 你是对的@AnthonySimmon,感谢您指出这一点。你的解决方案效率更高
      猜你喜欢
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      • 2010-10-30
      • 1970-01-01
      • 2019-09-26
      • 1970-01-01
      • 2021-12-17
      • 2014-12-26
      相关资源
      最近更新 更多