介绍
ASP.NET ViewState
是一种客户端状态管理机制,ViewState
存储在ID为__VIEWSTATE
的隐藏字段中,通常,存储的ViewState
信息如下所示:
看起来像一个加密的string
,这只是Base64
编码的string
,不是加密的string
,因此可以轻松解码。
使用Base64
编码的主要原因如下:
Base64
使string
适合HTTP传输 尝试使用string
解码ViewState
解码器(由Fritz Onion创建的好工具)。
在解码string
之后,我们可以看到存储在ViewState
内部的确切数据。
你可以编写几行代码来解码文本,并获得实际的视图状态信息。
以下是ViewState
的工作原理:
默认情况下,ViewState
被序列化为Base-64编码的string
,在postback上,ViewState
信息被加载,并重新应用于控件层次结构中控件的持久状态。
解决方案
有两种不同的方法可以防止某人解密ViewState
数据。
使用EnableViewStateMac="True"
时,在ViewState
save期间,ASP.NET在内部使用哈希代码,此哈希代码是加密的强校验和,这与ViewState
内容一起添加并存储在隐藏文件中,在postback期间,校验和数据再次由ASP.NET验证,如果不匹配,将拒绝postback。
EnableViewStateMAC=true
来实现,MAC代表"消息验证码"ViewStateEncryptionMode="Always"
,这将加密ViewState
数据,你可以这样做:ViewStateEncryptionMode
有三个不同的选项可以设置:
Always
:加密ViewState
始终Auto
:如果控件请求加密,就加密,为了实现这个,控件必须调用 Page.RegisterRequiresViewStateEncryption()
方法方法方法Never
:从不加密ViewState
如果设置ViewStateEncryptionMode="Always"
,并尝试解码ViewState
数据,你会得到如下所示的信息:
可以为EnableViewStateMAC
和ViewStateEncryptionMode
在web.config中启用这些设置:
注:如果不需要ViewState
加密,请尝试避免它,因为它可能导致性能问题。