2013-02-28 52 views
3

我試圖開發一個安全的Web應用程序,它可以接受表單數據,將其編碼到數據庫中以消除跨站點腳本問題,然後在其他網頁上很好地格式化它。HttpUtility.HtmlEncode,HttpUtility.HtmlDecode,AntiXSS庫和正確格式化用戶輸入的輸入

表單數據被使用

HttpUtility.HtmlEncode('It's my wedding!') 

是有人進入這個工作的一個例子編碼「這是我的婚禮!」到一個文本框。這進入數據庫格式爲:

它'是我的婚禮!

如果我從數據庫中提取出來並使用.NET文本控件顯示它,則顯示的內容與此完全相同,撇號仍保留在屏幕上。

Web瀏覽器將&解釋爲&符號並©解釋爲版權符號 - 爲什麼他們不將代碼'解釋爲撇號?

說我再使用:

HttpUtility.HtmlDecode('It's my wedding!'); 

這將理清我的撇號問題,但如果我使用時,有人已經成功注入惡意的JavaScript進入這一領域,如HtmlDecode方法:

It's my wedding!<script type="text/javascript">alert('XSS!');</script> 

它也將解碼編碼的JavaScript,並執行攻擊。如果是這種情況,爲什麼我們首先使用HttpUtility.HtmlEncode()?

我見過有人在使用Microsoft AntiXss庫http://wpl.codeplex.com/,但由於用戶無法修改它提供的白名單,它似乎正在接受有關其質量和有效性的可怕評論。

你應該怎麼做才能安全地對HTML進行編碼並允許它在顯示的同時還能防止XSS攻擊?剝離/編碼標籤是唯一的解決方案嗎?

以前大家怎麼處理過這個?

謝謝!

卡爾

+1

一個快速評論。您將其保存在數據庫上,然後將其打印在編碼的網頁上。 – Aristos 2013-02-28 09:29:56

回答

3

好的,這是我已經達到的解決方案。

我想保護其他開發人員關閉請求驗證和輸出字段而不檢查它們輸出的內容,所以我打算使用HttpUtility.HtmlEncode方法對輸入進行編碼。這意味着當其他開發者吐出這些信息時,它仍然是編碼的,如果他們希望輕率地將內容扔進HttpUtility.HtmlDecode,那麼這是他們的責任。

但是,我將構建一種方法,它只能轉義我在用戶輸入中頻繁看到的最基本的格式,這些格式可以被解釋爲安全。在我的情況下,這些字符是單引號和雙引號。所有其他內容將保持編碼。如果在我現實生活中的用戶輸入或測試輸入中出現了很多特殊的安全字符,我沒有解決,我會追溯將它添加到白名單中。

+0

請改用AntiXss lib,http://www.nuget.org/packages/AntiXss/ HttpUtility.HtmlEncode不包含所有可能的XSS攻擊。 – 2014-07-23 09:25:33

2

您是如何接收數據的?

無論如何,默認情況下,.NET WebForms基礎結構本身應該會阻止很多這些事情,假設ValidateRequest設置爲true

輸出用戶輸入的數據時應該使用HtmlEncode(從而防止出現不適)。在這種情況下,HtmlDecode不會參加聚會。

+0

感謝您回答Keith! 如果您使用HtmlEncode,那麼確實會阻止nastiness,但格式化會完全丟失,因爲上面提到的撇號等字符是編碼的,並且瀏覽器不會正確解釋和格式化它們。我想格式化的內容,但編碼的HTML - 是否超出此實用程序的幫助? – Karl 2013-03-02 16:39:01