ViewState 是 ASP.NET 維護頁面狀態的機制,儲存於隱藏欄位 __VIEWSTATE。許多開發者誤以為其已加密,實則僅 Base64 編碼,極易遭竄改與資訊洩露。本文依 STRIDE 模型分析威脅並示範內建防禦用法。
ViewState 內容可輕易反序列化:
LosFormatter formatter = new LosFormatter();
object viewstateObj = formatter.Deserialize("/wEPDwULLTE2MTY2ODcyMjkPFgIeCHBhc3N3b3JkBQlzd29yZGZpc2hkZA==");
除錯器可見明文密碼 swordfish 等敏感資料。線上解碼工具 (如 Fritz Onion ViewState Decoder) 更降低攻擊門檻。
攻擊者修改 ViewState 中的角色、權限欄位,重新計算 MAC (若啟用) 或直接送出(若未啟用),可能繞過授權檢查。
<pages enableViewStateMac="true" /> (預設開啟),驗證完整性。<pages viewStateEncryptionMode="Always" />,防止竊閱。<machineKey validationKey="AutoGenerate" decryptionKey="AutoGenerate" />,Web Farm 需同步金鑰。machineKey,避免金鑰洩露長期有效。ViewState[...] = 寫入敏感資料的情形。ViewState 便利但危險。正確配置 enableViewStateMac、viewStateEncryptionMode 與 machineKey,並避免存放敏感資訊,是 ASP.NET 應用安全的基石。