前言
在 .NET Framework 4.5.1 (含)以前的版本,
如果使用到 XmlDocument , XmlTextReader or XPathNavigator 則會有 XML External Entity (XXE) 的風險存在。
例如使用 XmlDocument 的 Load 檔案,而檔案的內容為,
1 |
|
如果權限夠的話,就可以將 C:\Windows\Win.ini 的檔案內容讀取出來。
同樣都是讀取 XML , ADO.NET 中的 DataSet 物件的 ReadXml 會有一樣的問題嗎?
研究
所以我們建立一個含有 XML External Entitie 的 DataSet XML 檔案(readDS2.xml),如下,
1 |
|
再透過 ADO.NET DataSet 將它讀取進來(.NET 4.5應用程式),
1 | string filename = "readDS2.xml"; |
結果程式會發生XmlSchemaInferenceException的錯誤,
System.Xml.Schema.XmlSchemaInferenceException
HResult=0x80131941
Message=參考無法處理實體參考。請傳遞可展開實體的 ‘XmlReader’。
Source=System.Xml
所以,如果直接使用 DataSet 的 ReadXml 是不會有 XXE 的風險。
但如果是自已透過 XmlReader 讀取,又將 XmlReaderSettings 的 DtdProcessing 設定成 DtdProcessing.Parse 。那就會處理 DTD ,而造成 XXE 的風險。例如,
1 | string filename = "readDS2.xml"; |
所以,除了檢查系統有無升級到 .NET 4.5.2(含) 以上的版本外,
也要檢查程式中,有沒有在處理 XML 的地方,
有將 XmlReaderSettings 的 DtdProcessing 設定為 DtdProcessing.Parse
如果直接使用 DataSet 的 ReadXml 不會有 XXE 的風險