2017-02-27 61 views
0
XmlDocument doc = new XmlDocument(); 
doc.LoadXml(template); 
XmlElement list = doc.CreateElement(conn.XmlListTagName); 
foreach (EaiItem updateItem in itemList) 
{ 
    XmlElement item = doc.CreateElement(conn.XmlItemTagName); 
    foreach(String itemAttrib in updateItem.ItemAttributes.Keys) 
    { 
     item.SetAttribute(itemAttrib, updateItem.ItemAttributes[itemAttrib]); 
    } 
    item.InnerXml = updateItem.ItemFieldXml; 
    list.AppendChild(item); 
} 
doc.LastChild.AppendChild(list); 

Fortify的工具在下面的代碼XML注入C#

item.InnerXml = updateItem.ItemFieldXml; 

如何防止XML注入問題顯示XML注入?

+0

問題是什麼?我假設'ItemFieldXml'包含要插入到文檔中的XML,作爲'item'元素的子XML片段?或者你想把它存儲爲'CDATA'? – Dai

回答

1

如果您ItemFieldXml應該在你的XML,而不是被存儲爲CDATA實際 XML的,然後使用XmlDocument.CreateCDataSection

所以不是這樣的:

item.InnerXml = updateItem.ItemFieldXml; 
list.AppendChild(item); 

這樣做:

XmlCDataSection cdata = doc.CreateCDataSection(updatedItem.ItemFieldXml); 
item.AppendChild(cdata); 
list.AppendChild(item); 

這將呈現爲:

<item> 
<![CDATA[ 
<foo>embedded XML that is escaped!</foo> 
]]> 
</item> 

<foo>文本將而不是通過符合XML解析器被解釋爲實際的XML。

另一種方法是創建一個文本節點其中,尖括號將被轉換爲XML實體&lt;&gt;,和``& though using CDATA`效率會更高,如果你有很多尖括號的,因爲它使用較少空間。

item.InnerText = updatedItem.ItemFieldXml; 
list.AppendChild(item); 

這將作爲渲染:

<item> 
&lt;foo&gt;embedded XML that is escaped!&lt;/foo&gt; 
</item>