2013-02-08 218 views
5

我正在研究ASP.Net C#+ jQuery ajax網站項目。我試圖防止xss攻擊,我知道下面並不是完整的方法,但這至少是我應該做的 - 在接受用戶的免費字符串輸入時使用HtmlEncode)。而且我真的很樂意檢查我是否做對了。防止XSS攻擊

假設我們有一個場景,其中一個頁面控件是一個「描述」文本框,用戶可以輸入用於描述其產品的「免費」字符串。爲防止xss攻擊輸入,在服務器端頁面方法中,我使用HtmlUtility.HtmlEncode()打包了「說明」文本,因此在進入數據庫之前該字符串將被解釋爲純文本,即<script>變爲&gt;script&lt;

下面的部分是我所懷疑的 - 如何處理html編碼的文本,然後將其返回給用戶?

當用戶想查看輸入的描述文本時,網站從數據庫中檢索並打印出來。

對描述執行html解碼是合乎邏輯的,所以用戶不會看到那些奇怪的&gt;&lt;字符?它會首先破壞使用HtmlEncode的目的嗎?如果是的話,這是正確的jQuery行解碼和打印文本回給用戶?

$("#txtDescription").val($(this).html(obj.Description).text();

謝謝你非常非常

回答

1

您需要牢記您處理的每個字符串的內容類型以及它來自哪裏 - 無論是來自安全來源還是來自不可信來源,並且還知道何時連接兩個字符串,這兩個字符串都是相同內容的字符串類型和信任級別。

我包裹起來使用HtmlUtility.HtmlEncode()「描述」文本,因此該字符串將之前進入數據庫即<script>變得&gt;script&lt;被解釋爲純文本。

這聽起來像你說的描述字段是純文本字符串,然後你要在數據庫中存儲是安全的HTML的字符串(因爲HtmlEncode的輸出保證不含有危險碼)。

這顯示了過早編碼內容的第一個問題。如果您正在編寫一個要發送到服務器的SQL字符串,則預編碼爲HTML並不能保護您免受SQL注入。使用SQL準備語句是克服SQL的一個好方法,但預編碼不會在所有上下文中呈現字符串安全。

接下來的部分是我懷疑 - 如何處理html編碼的文本,然後再返回給用戶?

當用戶想查看輸入的描述文本時,網站從數據庫中檢索並打印出來。

如果用戶正在接收安全的HTML,並且您有一串安全的HTML,則可以將其發送給用戶。

如果用戶收到純文本電子郵件,則需要將存儲在數據庫中的安全HTML轉換爲純文本。

如果用戶正在接收RSS,那麼您需要確保使用XML的子字符串撰寫RSS。

Contextual auto-escaping可以幫助您確保值在輸出上正確編碼。

6

不編碼的文本進入數據庫。以未經過濾的原始形式存放它。只有當字符串輸出到支持HTML的上下文中(如輸出到瀏覽器)時纔對HTML字符進行編碼。

+0

嗨Kolink,謝謝你的回覆:)。最好是將文本保存到數據庫中,使用未經過濾的原始格式,但是在進入數據庫之前,我的系統需要進行包裝,不管怎樣,我不知道如何將其打印回用戶 – user1487182

+0

我們應該向用戶打印奇怪的字符,還是在打印之前先解碼字符是正常的做法?如果是這樣,如何處理這部分?我需要打印這些值迴文本框和它顯示像" > <腳本>警報(' XSS ')< /腳本>謝謝你這麼多 – user1487182

+1

這將是有益的事情,如果有人說出爲什麼你不應該編碼文本進入數據庫......特別是因爲答案有5票(頁面上最多)。 – EleventyOne

0

使用AntiXss library代替httputility.htmlencode是個好主意。考慮閱讀文檔以獲得更加清晰的內容。您在AntiXSS庫w.r.t輸入編碼中有更廣泛的選項。它遵循這個discussion中提到的更安全的基於白名單的方法。