今天討論 viewstate 如何保存資訊
我們先來看一下viewstate,當我們在寫一個 asp.net 時,標明了 form runat=server,那 asp.net 就會自動在頁面加一個隱藏 Tag
透過這個 Tag,頁面裏所有的控制項的狀態,包括頁面本身的一些狀態都會保存到這個 hidden。每次頁面提交時會將 _VIEWSTATE 送到 Server, Server 對其值進行解碼,然後輸出時再根據這個值來恢復各個控制項的狀態。我們再研究這個控制項的值,很多人會看不懂這這個資料,其實 .NET 僅僅是給每個控制項和頁面的狀態存入適當的物件裏面,然後把該物件序列化,最後再做一次 base64 編碼。
為了保護 VIEWSTATE 沒被串改,我們可以在頁面頂部加入如下代碼:<%@ Page EnableViewStateMac="true" %>,這樣 asp.net 就會自動的在 viewstate 中追加一個 code,在頁面回傳時,伺服器根據回傳的 viewstate 生成一個 code,再與回傳的 code 相比較,如果不對,則丟棄該view state,同時控制項將恢復初試狀態
另外只要在 machine.config 裏設置一下 machineKey validation="3DES" 即可達到用 des 加密viewstate。