C# 防止XmlReader扩展XML实体

C# 防止XmlReader扩展XML实体,c#,.net,xml,dtd,xmlreader,C#,.net,Xml,Dtd,Xmlreader,有没有办法防止.NET的XmlReader类在读取内容时将XML实体扩展为它们的值 例如,假设以下XML用作输入: <?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE author PUBLIC "ISO 8879:1986//ENTITIES Added Latin 1//EN//XML" "http://www.oasis-open.org/docbook/xmlcharent/0.3/iso-l

有没有办法防止.NET的
XmlReader
类在读取内容时将XML实体扩展为它们的值

例如,假设以下XML用作输入:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE author PUBLIC "ISO 8879:1986//ENTITIES Added Latin 1//EN//XML" "http://www.oasis-open.org/docbook/xmlcharent/0.3/iso-lat1.ent" >
<author>&aacute;</author>

&aa可爱;
让我们假设不可能达到扩展aacute实体所需的外部OASIS DTD。我希望读者按顺序阅读author元素,然后是类型为
EntityReference
的aacute节点,最后是author-end元素,而不会抛出任何错误。我怎样才能做到这一点


更新:我还想防止字符实体的扩展,例如
á

一种方法是使用“XmlTextReader”,如下所示:

using (var reader = new XmlTextReader(@"your url"))
{
    // note this
    reader.EntityHandling = EntityHandling.ExpandCharEntities;
    while (reader.Read())
    {
        // here it will be EntityReference with no exceptions
    }
}
如果这不是一个选项-您可以使用
XmlReader
执行相同的操作,但需要进行一些反思(至少我不知道其他方法):


XML解析是危险的。在某些情况下,它允许CVE和拒绝服务攻击

比如说

并对其进行了讨论

最感兴趣的文档是 它为开发人员提供了实现和建议

检索资源

<!DOCTYPE roottag [
 <!ENTITY windowsfile SYSTEM "file:///c:/boot.ini">
]>
<roottag>
 <sometag>&windowsfile;</sometag>
</roottag>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE root
  [
  <!ENTITY a0 "test" >
  <!ENTITY a1 "&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;">
  <!ENTITY a2 "&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;">
  <!ENTITY a3 "&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;">
  <!ENTITY a4 "&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;">
  ]>
<root>&a4;</root>

&窗口文件;
DoS

<!DOCTYPE roottag [
 <!ENTITY windowsfile SYSTEM "file:///c:/boot.ini">
]>
<roottag>
 <sometag>&windowsfile;</sometag>
</roottag>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE root
  [
  <!ENTITY a0 "test" >
  <!ENTITY a1 "&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;">
  <!ENTITY a2 "&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;">
  <!ENTITY a3 "&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;">
  <!ENTITY a4 "&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;">
  ]>
<root>&a4;</root>

]>
&a4;
回到你的问题。
正如@Evk所写的: 通过设置,可以防止展开除CharEntities之外的所有实体

除了您自己的XmlReader实现之外,我不知道防止扩展实体的解决方案

我认为您还需要防止解析
&&载脂蛋白;“

FYIXmlTextReader解析CharEntity的方式和位置

XmlTextReader






此函数最终解析数字字符实体引用(例如
á;



此函数解析命名字符实体引用(
&;&apos;“

这与我要查找的非常接近,但我也希望防止字符实体的扩展。EntityHandling枚举的值也不允许这种情况。@GabrielS我知道您可能不想扩展实体,但为什么不扩展char实体呢?我正在处理的应用程序需要控制所有XML实体的扩展,因为它对每个实体都执行一些自定义处理。这就是为什么它需要从
XmlReader
接收未扩展的实体引用,而不是扩展的结果。我不确定使用XmlReader或XmlTextReader是否可能。也许如果创建自定义XmlReader并将大多数功能委托给默认的XmlReader…什么.net framework版本?@galakt.net 4.5虽然您指向代码处理实体的确切链接提供了有用的见解,但重写
XmlTextReaderImpl
对我来说并不是一个真正的选择。我也看不到从这个类继承和重写这个特定部分的任何可能性,特别是因为它甚至不是公共的。我现在看到的唯一选择是预处理XML,将实体更改为一些特殊文本,这些文本不再被
XmlReader
视为实体引用,但我可以处理未展开的文本。