导读:本期聚焦于小伙伴创作的《.NET如何处理XML上传中的Billion Laughs攻击?XmlReaderSettings该怎么配置》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《.NET如何处理XML上传中的Billion Laughs攻击?XmlReaderSettings该怎么配置》有用,将其分享出去将是对创作者最好的鼓励。

在.NET后端服务里,用户上传XML文件是相当普遍的需求,但如果直接信任外部传入的XML并使用默认方式解析,就可能遭遇Billion Laughs攻击。这种攻击通过定义多层嵌套的实体引用,使一个几KB的文件在解析后膨胀为几百MB甚至上GB的内容,最终拖垮服务器。

.NET如何处理XML上传中的Billion Laughs攻击?XmlReaderSettings该怎么配置

什么是Billion Laughs攻击

Billion Laughs攻击又称XML实体膨胀攻击,它借助文档类型定义(DTD)中的内部实体,进行反复嵌套引用。例如下面的XML片段:

<?xml version="1.0"?>
<!DOCTYPE lolz [
  <!ENTITY lol "lol">
  <!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
  <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
  <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
]>
<lolz>&lol4;</lolz>

上面仅写了几层实体,实际攻击会嵌套几十层,解析器展开后会产生数十亿个字符串,迅速消耗系统资源。

XmlReaderSettings关键防护属性

在.NET中,推荐使用XmlReader配合XmlReaderSettings来读取不可信XML。下面列出最常用的防护配置:

属性作用
DtdProcessing设置为Ignore或Prohibit可禁止解析DTD,从根源阻断实体定义
MaxCharactersInDocument限制整个文档展开后的最大字符数
MaxCharactersFromEntities限制由实体展开所产生的最大字符数
XmlResolver设为null可避免外部资源加载造成的SSRF或文件读取

安全解析上传XML的示例

以下C#代码演示了在ASP.NET接收上传文件时,如何使用XmlReaderSettings防止Billion Laughs攻击:

using System;
using System.IO;
using System.Xml;

public class XmlUploadHandler
{
    public static void SafeParse(Stream xmlStream)
    {
        // 创建安全的读取配置
        XmlReaderSettings settings = new XmlReaderSettings();
        // 禁止DTD处理,防止实体定义
        settings.DtdProcessing = DtdProcessing.Prohibit;
        // 限制文档总字符数
        settings.MaxCharactersInDocument = 1024 * 1024;
        // 限制实体展开字符数
        settings.MaxCharactersFromEntities = 0;
        // 禁止解析外部引用
        settings.XmlResolver = null;

        using (XmlReader reader = XmlReader.Create(xmlStream, settings))
        {
            while (reader.Read())
            {
                // 正常业务处理节点
                if (reader.NodeType == XmlNodeType.Element)
                {
                    Console.WriteLine("元素: " + reader.Name);
                }
            }
        }
    }
}

常见错误用法

很多项目为了省事会采用下面这种方式加载XML:

// 危险:默认允许DTD,且无限制
XmlDocument doc = new XmlDocument();
doc.Load(uploadStream);

XmlDocument默认会处理DTD,且未限制展开大小,攻击者上传恶意文件就能直接打满内存。如果必须使用XmlDocument,也应当先通过安全的XmlReader读取,再传入Load方法。

小结

面对XML上传场景,开发者不应信任任何外部文档。将XmlReaderSettings的DtdProcessing设为Prohibit,配合字符数限制与关闭XmlResolver,就能在.NET中稳妥抵御Billion Laughs攻击。把这些配置封装成公共方法,可以让所有上传入口都具备基础的安全防御能力。

XmlReaderSettingsBillion_Laughs攻击XML上传修改时间:2026-07-29 10:39:27

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。