c# - 如何在 .net 反序列化期间防止 XML 外部实体 (XXE) 攻击

标签 c# .net xml veracode

我们正在使用 veracode 对我们的代码进行安全分析,它显示了以下代码的 XXE 漏洞,特别是在调用 Deserialize() 的地方。我们如何防止序列化程序访问外部实体。我在下面为 XMLReader 将 XMLresolver 设置为 null 的尝试不起作用。

    public static T DeserializeObject(string xml, string Namespace)
    {
        System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(T), Namespace);

        MemoryStream stream =
                new MemoryStream(Encoding.Default.GetBytes(xml));
        XmlReaderSettings settings = new XmlReaderSettings();

        // allow entity parsing but do so more safely
        settings.DtdProcessing = DtdProcessing.Ignore;
        settings.XmlResolver = null;

        using (XmlReader reader = XmlReader.Create(stream, settings))
        {
            return serializer.Deserialize(reader) as T;
        }
    }

任何人都可以建议我可能遗漏了什么,或者是否还有其他尝试。

最佳答案

我遇到了类似的问题。您需要在读取字符串时将 xmlReader 更改为 xmlTextReader。

像这样的——

  public static T DeserializeObject(string xml, string Namespace)
  {
        System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(T), Namespace);

        //**** I don't think you need this block of code *********
        //MemoryStream stream = new MemoryStream(Encoding.Default.GetBytes(xml));
        //XmlReaderSettings settings = new XmlReaderSettings();

        // allow entity parsing but do so more safely
        //settings.DtdProcessing = DtdProcessing.Ignore;
        //settings.XmlResolver = null;
        //*********************************************

        XmlTextReader reader = new XmlTextReader(xml)
        {
            XmlResolver = null
        };

        return serializer.Deserialize(reader) as T;
  }

祝一切顺利!

关于c# - 如何在 .net 反序列化期间防止 XML 外部实体 (XXE) 攻击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34995497/

相关文章:

c# - 字节到二进制字符串 C# - 显示所有 8 位数字

javascript - 将整数列表发送到 REST API 会抛出 415(不支持的媒体类型)

c# - 使用 SystemParametersInfo SPI_GETICONTITLELOGFONT

javascript - 如何与 PaladinPanoramic API 服务器交互?

java - 如何使线性布局出现在 GridView 中?

html - Div 和表格宽度不会保持其原始形式,并且会超出行

c# - 无法使用枚举隐式转换类型

c# - EF AssociationSet 处于已删除状态错误

.net - RX : how to parallelize some long running tasks and synchronize others

c# - 没有消息帧的 TCP 上的 Xml