經常有人質疑 ASP.NET 的 ViewState 儘量不要儲存一些安全性資料,當然這在網頁設計時必須儘量避免的,因為 ViewState 在儲存時『預設』只使用 Base-64 做加密,而 Base-64 其實只能防君子不能防小人,因為 Base-64 只經過簡單的演算法計算後,再使用 Base-64 的對照表對應出一定的編碼字串,因此,很容易被有心人所破解。
而 Base-64 其實在我們生活中其實是最常被使用的,也就是我們每天使用的 E-Mail 大部分就是使用這類的簡單加密,而因為 Base-64 不是那麼的安全,後來在 E-Mail 的加密處理上才會應用各式各樣的加密機制來解決一些機密的 E-Mail 的內容加密的問題,不過你會懷疑為什麼加密如此重要而我們何不儘量使用 Base-64 以外的加密技術呢?我想,這是需要以不同時機來做考量的,因為複雜的加密演算法相對的會消耗一些效能及網路傳輸量可能因此增多,所以是否要每個在網路傳輸 的資料都要經過加密的考量上,這都必須思考的問題,不然為了在 E-Mail 上與朋友問個新年快樂也要加密的話那勢必是太多此一舉了。
所 以,微軟在 ASP.NET 的 ViewState 預設也是利用 Base-64 來為一些表單等欄位個值做加密,原因當然就是不想讓『每個人』都可以輕易瀏覽 ViewState 的值,不過程式設計師也必須儘量避免在程式內寫個 ViewState("XXX")="AAA" 來暫存資料,除非是不重要的資料才可使用這種方法。不信的話你可以把你在 Page 的原始碼的 ViewState 拿到下列網址去看看就可知道到底有多不安全了,http://www.wilsondotnet.com/Demos/ViewState.aspx。
那 麼,難道 ASP.NET 的 ViewState 完全不能加密嗎?答案是否定的,因為你可別忘了.NET Framework提供了很多實作加解密的名稱空間讓我們使用,而且他也考量到舊版的 ASP 的不安全性,所以對 ASP.NET 做了很多架構上的調整,所以我們只需在 Web.Config 做簡單的設定即可完成加密動作,而在 ASP.NET 1.1 以前的版本只能做整個站台的 ViewState 做加密設定,無法針對特定的某些頁面才做加密,因此在 ASP.NET 2.0 的架構上也改善了這部分的不足,也就是程式設計師可以針對特定頁面的 ViewState 做加密設定了。
一、ASP.NET 1.1比前版本,請在 Web.Config 內做設定。
<configuration>
<system.web>
<machineKey validation="3DES" />
</system.web>
</configuration>
二、ASP.NET 2.0 。
1.在 Web.Config 做設定 -
<configuration>
<system.web>
<pages ViewStateEncryptionMode="Auto" />
</system.web>
</configuration>
ViewStateEncryptionMode有三種模式可設定,
a. Auto - 如果控制項呼叫 RegisterRequiresViewStateEncryption 方法要求加密,則 ViewState 資訊會加密。
b. Always - ViewState 資訊永遠加密。
c. Never - ViewState 永遠不加密,即使控制項要求加密。
2.在每個 Page 做設定 -
<%@Page ViewStateEncryptionMode="Always" %>
設定完後你就可以再把你的 ViewState 拿到 http://www.wilsondotnet.com/Demos/ViewState.aspx 測試看看,是否可以在被剖析出來了呢?
附註:什麼是控制項呼叫 RegisterRequiresViewStateEncryption 方法?
假設你在Pageload()內,使用 Page.RegisterRequiresViewStateEncryption()。
···
···