我們對我們的代碼進行了安全審計,他們提到我們的代碼易受外部實體(XXE)攻擊。我使用下面的代碼 -如何防止XXE攻擊(.net中的XmlDocument)
string OurOutputXMLString=
"<ce><input><transaction><length>00000</length><tran_type>Login</tran_type></transaction><user><user_id>ce_userid</user_id><subscriber_name>ce_subscribername</subscriber_name><subscriber_id>ce_subscriberid</subscriber_id><group_id>ce_groupid</group_id><permissions></permissions></user><consumer><login_details><username>UnitTester9</username><password>pDhE5AsKBHw85Sqgg6qdKQ==</password><pin>tOlkiae9epM=</pin></login_details></consumer></input></ce>"
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(OurOutputXMLString);
在審計報告中,他們說,它的失敗,因爲XML實體可以包含可以解決預期contronl之外的URL。 XML實體解析器將嘗試解析和檢索外部引用。如果攻擊者控制的XML可以提交給其中一個功能,那麼攻擊者可以訪問關於內部網絡,本地文件系統或其他敏感數據的信息。 爲了避免這種情況,我寫了下面的代碼,但它不起作用。
MemoryStream stream =
new MemoryStream(System.Text.Encoding.Default.GetBytes(OurOutputXMLString));
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Prohibit;
settings.MaxCharactersFromEntities = 6000;
XmlReader reader = XmlReader.Create(stream, settings);
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(reader);
但我可以在這裏看到,讀者沒有任何價值加載到xmlDoc(XmlDocument)。 任何人都可以幫助我失去東西的地方? 任何幫助表示讚賞!
如果您確定不打算使用外部資源,則可以控制XmlDocument的XMLResolver使用的憑據。有關示例,請參閱http://msdn.microsoft.com/zh-cn/library/system.xml.xmldocument.xmlresolver.aspx。在這種情況下,您可以將XmlResolver的憑據設置爲僅具有有限訪問權限的帳戶,因此任何嘗試檢索資源都可以通過NT權限進行控制。 – dash
事實上,這裏是一個非常有用的MSDN文章,它解決了您的問題:http://msdn.microsoft.com/en-us/magazine/ee335713.aspx – dash