2011年5月19日 星期四

加強 Rich Editor 的安全性

為了讓網站提供一個豐富的編輯介面,一般都會去選擇一個功能強大的 Rich Editor / Html Editor 來使用。在 ASP.Net 裡,為了能夠順利配合 Rich Editor 的使用,會將頁面的 ValidateRequest 屬性設成 false。

<%@ Page Language="C#" ValidateRequest="false" %>

當 ValidateRequest 屬性為 true 時,ASP.Net 會去偵測頁面上是否有所謂的惡意字元,如果有發現的話,就會丟出 HttpRequestValidationException。但當你有 Rich Editor 的需求時,就不得不關閉 ASP.Net 預設所提供的安全防護。


假如當你關掉 ValidateRequest 後,使用者在你的 Rich Editor 編輯器輸入以下內容:

<style>@import"javascript:location.href='http://yahoo.com.tw'";</style>

之後存到資料庫,日後只要使用者瀏覽這段內容時,他的網頁就會被導到 http://yahoo.com.tw,造成我們耳熟能詳的釣魚網站攻擊。當然,比較新的瀏覽器已經針對這些有問題的寫法進行防堵,Fire Fox、Chrome、IE8 目前並不會執行上面那段程式碼,但 IE6 卻會。也就是說,當使用者的瀏覽器是 IE6 時,只要他瀏覽到被注入惡意程式碼網站時,就會發生網頁轉址的現象。

為了避免網站被值入惡意程式,可以參考[參考01][參考02]的作法,先對使用者網頁所輸入的內容利用 HttpUtility.UrlEncode() 進行編碼,然後在針對你所允許的 HTML 與法進行開放的動作。尤其是[參考02],連參考資訊都整理的非常豐富,值得好好拜讀。



參考:
01:How To: Prevent Cross-Site Scripting in ASP.NET
02:警告:为了安全请不要随意将ASP.Net的validateRequest="false" 

沒有留言:

張貼留言