近期
長沙網(wǎng)站設(shè)計公司簡界科技有客戶的微信商戶號接到微信團隊發(fā)來的消息通知:
消息1:《異常商戶號通知》
經(jīng)我司查核,貴方(商戶號:1413538102)存在 XXE(XML External Entity Injection)漏洞 問題,為保障相關(guān)交易對象的合法權(quán)益,確保交易財產(chǎn)的安全,我司將按協(xié)議及監(jiān)管要求對該商戶號執(zhí)行關(guān)閉支付權(quán)限,如有疑問,貴司可向我司申請技術(shù)協(xié)助。聯(lián)系方式為:WePayTS@tencent.com。
消息2:《XXE漏洞安全通知》
您公司系統(tǒng)的支付回調(diào)鏈接存在XXE漏洞,有被外界非法攻擊的風(fēng)險,請盡快安排技術(shù)人員參考微信支付安全實踐指引https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=23_5進行更新。
如有疑問,您也可以撥打95017-2或者通過郵箱過郵箱過郵箱過郵箱WePayTS@tencent.com與我們聯(lián)與我們聯(lián)與我們聯(lián)與我們聯(lián)系,感謝你對微信支付的支持。
根據(jù)微信支付開發(fā)文檔中介紹:XML外部實體注入漏洞(XML External Entity Injection,簡稱 XXE),該安全問題是由XML組件默認(rèn)沒有禁用外部實體引用導(dǎo)致,非微信支付系統(tǒng)存在漏洞。
XXE漏洞可能帶來的危害:可讀取任意文件;執(zhí)行系統(tǒng)命令;探測內(nèi)網(wǎng)端口;攻擊內(nèi)網(wǎng)網(wǎng)站
XXE的攻擊原理:外界攻擊者通過模擬回調(diào)通知,在回調(diào)通知中引入不安全的XML,商戶服務(wù)器上執(zhí)行系統(tǒng)命令。
長沙網(wǎng)站設(shè)計公司簡界科技提出修復(fù)方法:
XXE漏洞需要您在回調(diào)處理代碼里面解析XML之前,加入禁用實體解析的代碼,不同語言設(shè)置的內(nèi)容不同,下面提供了幾種主流開發(fā)語言的設(shè)置指引(您可以根據(jù)關(guān)鍵字找到xml解析組件采取對應(yīng)方法升級):
【PHP】 解析XML代碼前加入:
libxml_disable_entity_loader(true); //關(guān)鍵代碼
$xml = simplexml_load_string($xmlContent);
......
【JAVA】
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException; // catching unsupported features
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
String FEATURE = null;
try {
// This is the PRIMARY defense. If DTDs (doctypes) are disallowed, almost all XML entity attacks are prevented
// Xerces 2 only - http://xerces.apache.org/xerces2-j/features.html#disallow-doctype-decl
FEATURE = "http://apache.org/xml/features/disallow-doctype-decl";
dbf.setFeature(FEATURE, true);
// If you can't completely disable DTDs, then at least do the following:
// Xerces 1 - http://xerces.apache.org/xerces-j/features.html#external-general-entities
// Xerces 2 - http://xerces.apache.org/xerces2-j/features.html#external-general-entities
// JDK7+ - http://xml.org/sax/features/external-general-entities
FEATURE = "http://xml.org/sax/features/external-general-entities";
dbf.setFeature(FEATURE, false);
// Xerces 1 - http://xerces.apache.org/xerces-j/features.html#external-parameter-entities
// Xerces 2 - http://xerces.apache.org/xerces2-j/features.html#external-parameter-entities
// JDK7+ - http://xml.org/sax/features/external-parameter-entities
FEATURE = "http://xml.org/sax/features/external-parameter-entities";
dbf.setFeature(FEATURE, false);
// Disable external DTDs as well
FEATURE = "http://apache.org/xml/features/nonvalidating/load-external-dtd";
dbf.setFeature(FEATURE, false);
// and these as well, per Timothy Morgan's 2014 paper: "XML Schema, DTD, and Entity Attacks"
dbf.setXIncludeAware(false);
dbf.setExpandEntityReferences(false);
// And, per Timothy Morgan: "If for some reason support for inline DOCTYPEs are a requirement, then
// ensure the entity settings are disabled (as shown above) and beware that SSRF attacks
// (http://cwe.mitre.org/data/definitions/918.html) and denial
// of service attacks (such as billion laughs or decompression bombs via "jar:") are a risk."
// remaining parser logic
} catch (ParserConfigurationException e) {
// This should catch a failed setFeature feature
logger.info("ParserConfigurationException was thrown. The feature '" +
FEATURE + "' is probably not supported by your XML processor.");
}
catch (SAXException e) {
// On Apache, this should be thrown when disallowing DOCTYPE
logger.warning("A DOCTYPE was passed into the XML document");
}
catch (IOException e) {
// XXE that points to a file that doesn't exist
logger.error("IOException occurred, XXE may still possible: " + e.getMessage());
}
DocumentBuilder safebuilder = dbf.newDocumentBuilder();
【.Net】
XmlDocument doc= new XmlDocument();
doc.XmlResolver = null;//關(guān)鍵代碼
......
關(guān)于XXE漏洞的修復(fù)更多介紹請參考微信支付開發(fā)文檔https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=23_5
接入來介紹下XML外部實體注入詳細(xì)的預(yù)防措施:
XML外部實體注入(XXE)現(xiàn)在通過點A4成為OWASP Top 10的一部分,它是對解析XML輸入的應(yīng)用程序的一種攻擊。
XXE問題在“ 通用弱點枚舉”參考中的ID 611下引用。
當(dāng)弱配置的XML解析器處理包含對外部實體的引用的不受信任的XML輸入時,就會發(fā)生此攻擊。
這種攻擊可能導(dǎo)致泄露機密數(shù)據(jù),拒絕服務(wù),服務(wù)器端請求偽造(SSRF),從解析器所在的計算機角度進行端口掃描以及其他系統(tǒng)影響。以下指南提供了簡要信息以防止此漏洞。
有關(guān)XXE的更多信息,請訪問XML外部實體(XXE)。
一般指導(dǎo)
防止XXE的最安全方法始終是完全禁用DTD(外部實體)。根據(jù)解析器,該方法應(yīng)類似于以下內(nèi)容:
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
禁用DTD還可以使解析器安全地抵御拒絕服務(wù)(DOS)攻擊,例如Billion Laughs。如果不可能完全禁用DTD,則必須以特定于每個解析器的方式禁用外部實體和外部文檔類型聲明。
下面提供了針對多種語言的詳細(xì)XXE預(yù)防指南以及這些語言中常用的XML解析器。
C / C ++
libxml2的
枚舉xmlParserOption不應(yīng)定義以下選項:
XML_PARSE_NOENT:擴展實體并用替換文本替換它們
XML_PARSE_DTDLOAD:加載外部DTD
注意:
Per:根據(jù)這篇文章,從libxml2版本2.9開始,默認(rèn)情況下,XXE已禁用,如以下補丁所提交的那樣。
搜索以下API的用法,以確保沒有XML_PARSE_NOENT和XML_PARSE_DTDLOAD在參數(shù)中定義:
xmlCtxtReadDoc
xmlCtxtReadFd
xmlCtxtReadFile
xmlCtxtReadIO
xmlCtxtReadMemory
xmlCtxtUseOptions
xmlParseInNodeContext
xmlReadDoc
xmlReadFd
xmlReadFile
xmlReadIO
xmlReadMemory
libxerces-C
使用XercesDOMParser此操作可防止XXE:
XercesDOMParser *parser = new XercesDOMParser;
parser->setCreateEntityReferenceNodes(false);
使用SAXParser,請執(zhí)行以下操作以防止XXE:
SAXParser* parser = new SAXParser;
parser->setDisableDefaultEntityResolution(true);
使用SAX2XMLReader,這樣做可以防止XXE:
SAX2XMLReader* reader = XMLReaderFactory::createXMLReader();
parser->setFeature(XMLUni::fgXercesDisableDefaultEntityResolution, true);
Java的
使用XML庫的Java應(yīng)用程序特別容易受到XXE的攻擊,因為大多數(shù)Java XML解析器的默認(rèn)設(shè)置是啟用XXE。長沙網(wǎng)站設(shè)計公司建議為了安全地使用這些解析器,您必須在使用的解析器中顯式禁用XXE。下面介紹如何在最常用的Java XML解析器中禁用XXE。
JAXP DocumentBuilderFactory,SAXParserFactory和DOM4J
DocumentBuilderFactory, SAXParserFactory和DOM4J XML解析器可以使用相同的技術(shù)來保護他們免受XXE進行配置。
DocumentBuilderFactory這里僅提供示例。JAXP DocumentBuilderFactory setFeature)方法允許開發(fā)人員控制啟用或禁用哪些特定于實現(xiàn)的XML處理器功能。
可以在工廠或基礎(chǔ)XMLReader setFeature方法上設(shè)置功能。
每個XML處理器實現(xiàn)都有自己的功能,這些功能控制如何處理DTD和外部實體。
有關(guān)使用突出顯示語法的示例代碼片段的信息SAXParserFactory,請參見此處。
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException; // catching unsupported features
...
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
String FEATURE = null;
try {
// This is the PRIMARY defense. If DTDs (doctypes) are disallowed, almost all
// XML entity attacks are prevented
// Xerces 2 only - http://xerces.apache.org/xerces2-j/features.html#disallow-doctype-decl
FEATURE = "http://apache.org/xml/features/disallow-doctype-decl";
dbf.setFeature(FEATURE, true);
// If you can't completely disable DTDs, then at least do the following:
// Xerces 1 - http://xerces.apache.org/xerces-j/features.html#external-general-entities
// Xerces 2 - http://xerces.apache.org/xerces2-j/features.html#external-general-entities
// JDK7+ - http://xml.org/sax/features/external-general-entities
FEATURE = "http://xml.org/sax/features/external-general-entities";
dbf.setFeature(FEATURE, false);
// Xerces 1 - http://xerces.apache.org/xerces-j/features.html#external-parameter-entities
// Xerces 2 - http://xerces.apache.org/xerces2-j/features.html#external-parameter-entities
// JDK7+ - http://xml.org/sax/features/external-parameter-entities
FEATURE = "http://xml.org/sax/features/external-parameter-entities";
dbf.setFeature(FEATURE, false);
// Disable external DTDs as well
FEATURE = "http://apache.org/xml/features/nonvalidating/load-external-dtd";
dbf.setFeature(FEATURE, false);
// and these as well, per Timothy Morgan's 2014 paper: "XML Schema, DTD, and Entity Attacks"
dbf.setXIncludeAware(false);
dbf.setExpandEntityReferences(false);
// And, per Timothy Morgan: "If for some reason support for inline DOCTYPEs are a requirement, then
// ensure the entity settings are disabled (as shown above) and beware that SSRF attacks
// (http://cwe.mitre.org/data/definitions/918.html) and denial
// of service attacks (such as billion laughs or decompression bombs via "jar:") are a risk."
// remaining parser logic
...
} catch (ParserConfigurationException e) {
// This should catch a failed setFeature feature
logger.info("ParserConfigurationException was thrown. The feature '" + FEATURE
+ "' is probably not supported by your XML processor.");
...
} catch (SAXException e) {
// On Apache, this should be thrown when disallowing DOCTYPE
logger.warning("A DOCTYPE was passed into the XML document");
...
} catch (IOException e) {
// XXE that points to a file that doesn't exist
logger.error("IOException occurred, XXE may still possible: " + e.getMessage());
...
}
// Load XML file or stream using a XXE agnostic configured parser...
DocumentBuilder safebuilder = dbf.newDocumentBuilder();
Xerces 1 功能:
不要設(shè)置包括外部實體此功能來false。
不要設(shè)置包括參數(shù)實體此功能來false。
不要設(shè)置包括外部的DTD 此功能來false。
Xerces 2 功能:
通過設(shè)置禁止內(nèi)聯(lián)DTD 此功能來true。
不要設(shè)置包括外部實體此功能來false。
不要設(shè)置包括參數(shù)實體此功能來false。
不要設(shè)置包括外部的DTD 此功能來false。
注意:上面的防御措施要求Java 7 update 67,Java 8 update 20或更高版本,因為上述對策DocumentBuilderFactory和SAXParserFactory在較早的Java版本中已被破壞,具體如下:CVE-2014-6517。
XMLInputFactory(StAX解析器)
StAX解析器(例如)XMLInputFactory允許設(shè)置各種屬性和功能。
要保護Java XMLInputFactory免于XXE,請執(zhí)行以下操作:
// This disables DTDs entirely for that factory
xmlInputFactory.setProperty(XMLInputFactory.SUPPORT_DTD, false);
// disable external entities
xmlInputFactory.setProperty("javax.xml.stream.isSupportingExternalEntities", false);
TransformerFactory
要保護javax.xml.transform.TransformerFactoryXXE,請執(zhí)行以下操作:
TransformerFactory tf = TransformerFactory.newInstance();
tf.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
tf.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");
Validator
要保護javax.xml.validation.ValidatorXXE,請執(zhí)行以下操作:
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
Schema schema = factory.newSchema();
Validator validator = schema.newValidator();
validator.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");
validator.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
SchemaFactory
要保護javax.xml.validation.SchemaFactoryXXE,請執(zhí)行以下操作:
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
factory.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");
factory.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
Schema schema = factory.newSchema(Source);
SAXTransformerFactory
要保護javax.xml.transform.sax.SAXTransformerFactoryXXE,請執(zhí)行以下操作:
SAXTransformerFactory sf = SAXTransformerFactory.newInstance();
sf.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
sf.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");
sf.newXMLFilter(Source);
注意:要使用以下內(nèi)容,XMLConstants需要JAXP 1.5,該版本已在7u40和Java 8中添加到Java中:
javax.xml.XMLConstants.ACCESS_EXTERNAL_DTD
javax.xml.XMLConstants.ACCESS_EXTERNAL_SCHEMA
javax.xml.XMLConstants.ACCESS_EXTERNAL_STYLESHEET
XMLReader的
長沙網(wǎng)站設(shè)計公司提示要保護Java org.xml.sax.XMLReader免于XXE,請執(zhí)行以下操作:
XMLReader reader = XMLReaderFactory.createXMLReader();
reader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
// This may not be strictly required as DTDs shouldn't be allowed at all, per previous line.
reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
reader.setFeature("http://xml.org/sax/features/external-general-entities", false);
reader.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
XMLReader
要保護Java org.dom4j.io.SAXReader免于XXE,請執(zhí)行以下操作:
saxReader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
saxReader.setFeature("http://xml.org/sax/features/external-general-entities", false);
saxReader.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
根據(jù)測試,如果您缺少其中之一,則仍然容易受到XXE攻擊。
SAXBuilder的
要保護Java org.jdom2.input.SAXBuilder免于XXE,請執(zhí)行以下操作:
SAXBuilder builder = new SAXBuilder();
builder.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);
builder.setFeature("http://xml.org/sax/features/external-general-entities", false);
builder.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
Document doc = builder.build(new File(fileName));
No-op EntityResolver
對于采用的API EntityResolver,您可以通過提供無操作實現(xiàn)來中和XML解析器解析實體的能力:
public final class NoOpEntityResolver implements EntityResolver {
public InputSource resolveEntity(String publicId, String systemId) {
return new InputSource(new StringReader(""));
}
}
// ...
xmlReader.setEntityResolver(new NoOpEntityResolver());
documentBuilder.setEntityResolver(new NoOpEntityResolver());
或更簡單地說:
EntityResolver noop = (publicId, systemId) -> new InputSource(new StringReader(""));
xmlReader.setEntityResolver(noop);
documentBuilder.setEntityResolver(noop);
JAXB Unmarshaller
由于javax.xml.bind.Unmarshaller解析XML并不支持禁用XXE的任何標(biāo)志,因此必須首先通過可配置的安全解析器解析不受信任的XML,然后生成一個源對象,并將該源對象傳遞給Unmarshaller。例如:
//Disable XXE
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setFeature("http://xml.org/sax/features/external-general-entities", false);
spf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
spf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
//Do unmarshall operation
Source xmlSource = new SAXSource(spf.newSAXParser().getXMLReader(),
new InputSource(new StringReader(xml)));
JAXBContext jc = JAXBContext.newInstance(Object.class);
Unmarshaller um = jc.createUnmarshaller();
um.unmarshal(xmlSource);
Java 8及更高版本
長沙網(wǎng)站設(shè)計公司認(rèn)為由于OpenJDK 8 beta 86中的JDK-8010393,javax.xml.bind.Unmarshaller默認(rèn)情況下實例是安全的。默認(rèn)情況下,此處提到的其他類在Java 8中仍然不安全。
XPathExpression
javax.xml.xpath.XPathExpression不能單獨安全地配置A ,因此必須首先通過另一個安全的XML解析器來解析不受信任的數(shù)據(jù)。
例如:
DocumentBuilderFactory df = DocumentBuilderFactory.newInstance();
df.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
df.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
DocumentBuilder builder = df.newDocumentBuilder();
String result = new XPathExpression().evaluate( builder.parse(
new ByteArrayInputStream(xml.getBytes())) );
java.beans.XMLDecoder中
此類中的readObject()方法從根本上講是不安全的。
它解析的XML不僅要服從XXE,而且該方法還可以用于構(gòu)造任何Java對象,并執(zhí)行此處所述的任意代碼。
除了信任或正確驗證傳遞給它的輸入之外,沒有其他方法可以安全地使用此類。
因此,我們強烈建議您完全避免使用此類,并使用本備忘單其他地方所述的安全或正確配置的XML解析器替換該類。
Other XML Parsers
有許多第三方庫可以直接解析XML或通過使用其他庫來解析XML。默認(rèn)情況下,請測試并驗證其XML解析器針對XXE是安全的。如果默認(rèn)情況下解析器不安全,請查找解析器支持的標(biāo)志以禁用所有可能的外部資源包含,如上面給出的示例。如果沒有外部控制,請確保不信任內(nèi)容先通過安全解析器傳遞,然后再傳遞到不安全的第三方解析器,類似于安全解組器的方式。
Spring Framework MVC / OXM XXE漏洞
例如,在Spring OXM和Spring MVC中發(fā)現(xiàn)了一些XXE漏洞。Spring框架的以下版本容易受到XXE的攻擊:
3.0.0至3.2.3(Spring OXM和Spring MVC)
4.0.0.M1(Spring OXM)
4.0.0.M1-4.0.0.M2(Spring MVC)
還有其他一些問題已在以后修復(fù),因此為了完全解決這些問題,Spring建議您升級到Spring Framework 3.2.8+或4.0.2+。
對于Spring OXM,這是指使用org.springframework.oxm.jaxb.Jaxb2Marshaller。請注意,Spring OXM的CVE特別指出了2種XML解析情況取決于開發(fā)人員是否正確,其中2種是Spring的職責(zé),并且已解決此CVE問題。
他們說的是:
開發(fā)人員必須處理兩種情況:
對于DOMSource,XML已經(jīng)由用戶代碼解析,并且該代碼負(fù)責(zé)防止XXE。
對于StAXSource,XMLStreamReader已由用戶代碼創(chuàng)建,并且該代碼負(fù)責(zé)防止XXE。
Spring修復(fù)的問題:
對于SAXSource和StreamSource實例,Spring默認(rèn)情況下會處理外部實體,從而創(chuàng)建此漏洞。
如果使用的是Spring OXM或Spring MVC的固定版本,下面是使用易受攻擊但現(xiàn)在很安全的StreamSource的示例:
import org.springframework.oxm.Jaxb2Marshaller;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
// Must cast return Object to whatever type you are unmarshalling
marshaller.unmarshal(new StreamSource(new StringReader(some_string_containing_XML));
因此,根據(jù)Spring OXM CVE編寫,以上內(nèi)容現(xiàn)在很安全。但是,如果要改用DOMSource或StAXSource,則由您決定將這些源配置為對XXE安全。
.NET
.NET中XXE注入的以下信息直接來自Dean Fleming的單元測試Web應(yīng)用程序。
該Web應(yīng)用程序涵蓋了當(dāng)前所有受支持的.NET XML解析器,并且針對每個應(yīng)用程序都有測試用例,以說明何時可以安全地進行XXE注入以及何時不安全。
以前,此信息基于James Jardine的出色的.NET XXE文章。
與如何防止.NET中的XXE和XML拒絕服務(wù)相比,它最初提供了比Microsoft較早的文章更新,更詳細(xì)的信息,但是,Web應(yīng)用程序涵蓋了一些不準(zhǔn)確之處。
下表列出了所有受支持的.NET XML解析器及其默認(rèn)安全級別:
XML Parser | Safe by default? |
LINQ to XML | Yes |
XmlDictionaryReader | Yes |
XmlDocument | |
...prior to 4.5.2 | No |
...in versions 4.5.2+ | Yes |
XmlNodeReader | Yes |
XmlReader | Yes |
XmlTextReader | |
...prior to 4.5.2 | No |
...in versions 4.5.2+ | Yes |
XPathNavigator | |
...prior to 4.5.2 | No |
...in versions 4.5.2+ | Yes |
XslCompiledTransform | Ye s |
LINQ轉(zhuǎn)XML
默認(rèn)情況下,庫中的XElement和XDocument對象System.Xml.Linq都不受XXE注入的影響。XElement僅解析XML文件中的元素,因此將完全忽略DTD。默認(rèn)情況下禁用了XDocument DTD ,并且僅在使用其他不安全的XML解析器構(gòu)造時才不安全。
XmlDictionaryReader
System.Xml.XmlDictionaryReader默認(rèn)情況下是安全的,因為當(dāng)它嘗試解析DTD時,編譯器會引發(fā)異常,指出“ CData元素在XML文檔的頂層無效”。如果使用其他不安全的XML解析器構(gòu)造,它將變得不安全。
XmlDocument
在此之前的.NET Framework版本4.5.2,System.Xml.XmlDocument是不安全的默認(rèn)。該XmlDocument對象中有一個XmlResolver對象,在4.5.2之前的版本中需要將其設(shè)置為null。在版本4.5.2及更高版本中XmlResolver,默認(rèn)情況下將其設(shè)置為null。
以下示例顯示了如何使其安全:
static void LoadXML()
{
string xxePayload = "<!DOCTYPE doc [<!ENTITY win SYSTEM 'file:///C:/Users/testdata2.txt'>]>"
+ "<doc>&win;</doc>";
string xml = "<?xml version='1.0' ?>" + xxePayload;
XmlDocument xmlDoc = new XmlDocument();
// Setting this to NULL disables DTDs - Its NOT null by default.
xmlDoc.XmlResolver = null;
xmlDoc.LoadXml(xml);
Console.WriteLine(xmlDoc.InnerText);
Console.ReadLine();
}
XmlDocument如果XmlResolver使用默認(rèn)或不安全設(shè)置創(chuàng)建自己的nonnull ,則可能會變得不安全。如果需要啟用DTD處理,請參閱MSDN文章中詳細(xì)說明如何安全地進行處理。
XmlNodeReader
System.Xml.XmlNodeReader 默認(rèn)情況下,對象是安全的,即使使用不安全的解析器構(gòu)造或包裝在另一個不安全的解析器中,它們也將忽略DTD。
XmlReader
System.Xml.XmlReader 默認(rèn)情況下,對象是安全的。
默認(rèn)情況下,將它們設(shè)置為在.NET Framework 4.0和更低版本中將其ProhibitDtd屬性設(shè)置為false,或者DtdProcessing在.NET 4.0和更高版本中將其屬性設(shè)置為Prohibit。
另外,長沙網(wǎng)站設(shè)計公司指出在.NET版本4.5.2后,XmlReaderSettings屬于XmlReader具有其XmlResolver默認(rèn)設(shè)置為NULL,它提供了安全性的附加層。
因此,XmlReader只有將兩個DtdProcessing屬性都設(shè)置為Parse且將XmlReaderSetting的s XmlResolver設(shè)置為具有默認(rèn)或不安全設(shè)置的nonnull XmlResolver時,對象才會在4.5.2及更高版本中變得不安全。如果需要啟用DTD處理,請參閱MSDN文章中詳細(xì)說明如何安全地進行處理。