在ASP.NET中加密頁面機制
本節介紹ASP.NET對視圖資訊的加密功能。Page.RegisterRequiresViewStateEncryption方法就是將控制項註冊為需要檢視狀態加密的控制項。如果您要開發用於處理潛在的敏感資訊的自訂控制項,請調用RegisterRequiresViewStateEncryption方法向頁註冊控制項,並確保該控制項的檢視狀態資訊已加密。
RegisterRequiresViewStateEncryption方法必須在頁生命週期的PreRender階段中或該階段之前調用,下面在前面ViewStateControl控制項中重寫OnPreRender方法並加入視圖加密功能,增加後的程式碼片段如下:
protected override void OnPreRender(EventArgs e)
{
this.Page.RegisterRequiresViewStateEncryption();
base.OnPreRender(e);
}
編譯控制項並在瀏覽器中重新運行,可以看到發送到用戶端的隱藏欄位視圖控制項中的值由:
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value= "/wEPDwULLTE3NjU0NjM4OTEPZBYCAgMPZBYEAgEPDw8WAh4OVGV4dF9WaWV3U3RhdGUFIuaIkeaYr+eUqFZpZXdTdGF0ZeWuueWZqOWtmOWCqOeahCFkFCsAAhYEHglCYWNrQ29sb3IKAB4EXyFTQgIIZ2QCBw8PFgIeBFRleHQF9QN0aGlzLlZpZXdTdGF0ZUNvbnRyb2wxLlRleHRfTm9WaWV3U3RhdGXlsZ7mgKcg5rKh5pyJ5L+d5a2Y6KeG5Zu+54q25oCBIDxJbWcgc3JjPSdJbWFnZXNcSlMuanBnJyAvPiAgPGJyPjxicj50aGlzLlZpZXdTdGF0ZUNvbnRyb2wxLlRleHRfVmlld1N0YXRl5bGe5oCnIOW3sue7j+S/neWtmOS6huinhuWbvueKtuaAgSA8SW1nIHNyYz0nSW1hZ2VzXFhMLmpwZycgLz4gIDxicj48YnI+dGhpcy5WaWV3U3RhdGVDb250cm9sMS5GYWNlU3R5bGXlsZ7mgKcuT0sg5bey57uP5L+d5a2Y5LqG6KeG5Zu+54q25oCBIDxJbWcgc3JjPSdJbWFnZXNcWEwuanBnJyAvPiAgPGJyPjxicj50aGlzLlZpZXdTdGF0ZUNvbnRyb2wxLkZhY2VTdHlsZS5CYWNrQ29sb3Ig5bey57uP5L+d5a2Y5LqG6KeG5Zu+54q25oCBLCDnnqfvvIzmiJHnmoTpopzoibLlsLHmmK/kv53lrZjnmoTpopzoibIgPEltZyBzcmM9J0ltYWdlc1xYTC5qcGcnIC8+ICA8SW1nIHNyYz0nSW1hZ2VzXEJHLmpwZycgLz4gPGJyPjxicj5kZGTFH8U37EhQNJzHTltcDxNaH2mMfQ==" />
變成了已經加密的散列碼:
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value= "J62G77yDi1rdf8+ZXszW1d3eAPnuzO8h2MCNPEN2HR6daQNjLLamfq4EHwWRRJ16S6kHFp43gwVPkMB9RPQtMaI5Gc+lZ9orQjsZWpvaVDTBI4fF6wFRj7qY1r2hREghEQYM/e1a+JX9oiWk1kUs8vFJ3SNeXCkCdDb7fQtr6DlCKsbCGGWDrawgiIsI0O5pnYMPloa+z74clY6/DYZ23BIAZNNYDLML/e7mVIzSS+V4FBZsXxBBdRx1oWJ60wjrfkScl1g0Dpbn+LZ2NIu7nh2t5Xu8iTW1NmjSfUoH9ymBmQkCNek3jaex18n9wBOdLGsQ8ZxO/hAGVqbcqTQStiuRYezjvm8T9Q0U9cj9SI+FnS2PktVHXqh6qLsjH1Dlwm+qFyjHK2fvbH+WA2NZUq3HzObR4GzNFRlZn8ZliO/FDJEKyH+x9X7qneaJs9dTg6mo/qbvI+S0W1viQ/nj/OrC3PoiLwvwyd1WjBlND4B21rVjnoq/J+jPNQGE+AdQR2fW3kYAtGhKf6PSVmUm9fZ26JY2rkYw2vBahPWmxHqnf9V5yt/0D3LP9Mx7KYay4PAItTeEzIT4G5I0Hp65a8d/QQJbQTCs1Qz798Mei66mqF8QrOBxR2EUsS+uCekxQe+2xDhX2kkxntoqxgRJ4/n8cdKr2Z+K3F3IEmxObo+QvQ5wUtMWrsKIY8Jad562zCNBGjlyU72i+KuORHQCBoXRgt5vPeIBpdjb0Vk3tb6t7g2T5yFyB7PBTqEwV43Ws4/BPxYsdr9YCNOJd/TB6cDI5FUS/dGYTej2EZt2HOPCM758WeEwBQZuG+t1dFEZU6+vicImHDV8ifCwNv+Yhw==" />
</div>
還可以指定檢視狀態資訊的加密模式,通過系統枚舉ViewStateEncryptionMode來設定,該枚舉可以控制是否加密檢視狀態資訊,它有三個枚舉項。
枚舉成員 說 明
Auto 如果控制項通過調用RegisterRequiresViewStateEncryption方法請求加密,則加密檢視狀態資訊;否則不加密。此值是Page.ViewStateEncryptionMode屬性的預設值
Always 強制加密檢視狀態資訊,而不管有沒有調用
Never 即使控制項請求加密,也不加密檢視狀態資訊
以上枚舉項除了在控制項中設定外,還可以在設定檔配置應用程式層級,或者在Page頁面中配置成頁面層級。在控制項或頁面中應用時僅作如下設定:
this.Page.ViewStateEncryptionMode = ViewStateEncryptionMode.Auto;
this.Page.RegisterRequiresViewStateEncryption();
經過如上設定後,頁架構會自動完成加密與解密功能。對該功能再補充兩點:
(1)加密檢視狀態肯定會影響到應用程式的效能,所以使用時要謹慎。
(2)只要頁面中有任何一個控制項要求對檢視狀態進行加密,那麼頁面中所有的檢視狀態也都將被加密。目前ASP.NET還沒有實現針頁面中某個控制項視圖加密功能(在調用時不管是在控制項中還是在頁面中都是調用頁面控制項Page的方法RegisterRequiresViewStateEncryption,且該方法沒有任何可重載方法)。