C# 防止XmlReader扩展XML实体
有没有办法防止.NET的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
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>á</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
视为实体引用,但我可以处理未展开的文本。