2009-10-22 109 views
1

我使用xsl轉換將xml文件轉換爲html中的dotNet。我將xml中的節點值轉換爲html標籤的內容和屬性。保護XSLT注入

我使用.Net DOM操作來編寫xml,使用任意的和可能的惡意文本設置節點的InnerText屬性。 現在,惡意製作的輸入字符串會使我的html不安全。例如,某些javascript可能來自用戶,並在輸出html中找到鏈接href屬性的方式,因此不安全。

問題很簡單,在將文本分配給InnerText屬性之前,必須對我的文本進行哪些清理(如果有的話)?我認爲分配給InnerText而不是InnerXml會完成所有需要的文本清理,但似乎並非如此。

我的轉換是否必須具有任何特殊的特性才能使其安全工作?任何.net特定的警告,我應該知道?

謝謝!

回答

0

事實證明,問題來自xsl本身,它使用了disable-output-escaping。沒有這些,Tranform本身就會完成所有必要的編碼。

如果您必須使用disable-output-escaping,則必須對每個元素使用appriate encodeinf函數。 HtmlEncode用於標記內容,HtmlAttributeEncode用於屬性值,UrlEncode用於html屬性值(例如href)

0

在使用XSLT進行轉換之前,您應該對XML進行清理。你可能會需要這樣的東西:

string encoded = HttpUtility.HtmlEncode("<script>alert('hi')</script>"); 
XmlElement node = xml.CreateElement("code"); 
node.InnerText = encoded; 

Console.WriteLine(encoded); 
Console.WriteLine(node.OuterXml); 

有了這個,你會得到

&lt;script&gt;alert('hi')&lt;/script&gt; 

當您添加這段文字到您的節點,你會得到

<code>&amp;lt;script&amp;gt;alert('hi')&amp;lt;/script&amp;gt;</code> 

現在,如果您運行XSLT,則此編碼的HTML不會在您的輸出中造成任何問題。

+0

如果您只是簡單地設置節點值而不是內部文本,您不會得到同樣的結果嗎? 'HtmlEncode()'對我來說似乎是多餘的。 – Tomalak

+0

@Tomalak,主要想法是在添加文本之前對它進行編碼(您將對它進行兩次編碼);添加,你可以使用.InnerText(如OP說)或。值 –

+0

哼...爲什麼需要編碼兩次,一次在HtmlEncode和一次在設置InnerText? –