2011-01-30 116 views
1

我有一個處理XML文檔以生成HTML的XSLT樣式表。防止XSLT生成的內容中的XSS(和其他攻擊)

我意識到可以通過用戶可以提供他們喜歡的任何XML的方式操作站點 - 不幸的是這是不可避免的,所以我想通過以下方式保護自己免受XSS(和其他攻擊)確保我的XSLT樣式表能夠安全地處理任何文檔。

我需要注意什麼來實現這個目標?

UPDATE:

我知道,在默認情況下XSLT逃逸輸出(可通過屬性disable-output-escaping被禁用) - 這是足以防止有人能夠注入惡意HTML元素和屬性?

+0

您能否解釋爲什麼您允許用戶提供自定義xml文檔?你能否使用模式強制驗證以避免任何問題? – sisve 2011-01-30 09:13:59

+0

@Simon XML文檔是一個SQL查詢執行計劃 - 它們不允許提供它,但它的構造查詢(它適用於[數據資源管理器](http://data.stackexchange.com/))的查詢是非常簡單的。包含一個被視爲執行計劃的xml文檔 - 我無法想到防止發生這種情況的方法。已經有一個[schema](http://schemas.microsoft.com/sqlserver/2004/07/showplan/),但我不確定如何驗證這個模式將有助於防止攻擊? – Justin 2011-01-30 09:32:15

回答

2

如果您正在處理來自不受信任源的XML數據並在網站上顯示結果,請務必記住它不被信任。

  • 您不應該使用xsl:copy或xsl:copy-of。如果直接複製除文本以外的節點,則可能會發生XSS攻擊。
  • 你不應該使用複雜的或遞歸的規則。特別製作的輸入可以通過延遲XSLT處理或使處理器崩潰來創建DoS。
  • 此外,正如你所說,不要禁用輸出轉義。

如果您將轉換結果傳遞給SQL服務器,則不應將任何提供的數據放入SQL查詢中。

例如,這是不好的:

<xsl:if test="@order">ORDER BY <xsl:value-of select="@order"/></xsl:test> 

這是件好事:

<xsl:if test="@order">ORDER BY 
    <xsl:chose><xsl:when test="@order = 'foo'">foo</xsl:when> [...] </xsl:chose> 
</xsl:test> 

如果你真的需要將數據傳遞到您的查詢,使用綁定變量。