原文:http://www.codeproject.com/Articles/150688/How-to-make-ViewState-secure-in-ASP-NET
介绍
ASP.NET中的ViewState是客户端的状态管理机制。ViewState通过一个ID __VIEWSTATE存储在一个隐藏的区域中。比如说:存储ViewState的信息像这样:
现在我们看下它的值。它看起来像是一个加密过的字符串。这不过是一个基于Base64编码的字符串,并不是一个加密的字符串。所以它很容易被解码。
使用Base64编码的主要原因如下:
1.Base64使字符串适合HTTP传输。
2.它使人们读起来有点困难。
但往往使人们感到困惑,以至于认为这是个加密的字符串。
让我们试着使用View Decoder(Fritz Onion开发的工具)来解码字符串。
解码后,我们可以看到存储在ViewState中的真实数据。
你可以写几行代码来解码文本,并且你也会得到真实的ViewState信息。
ViewState是如何工作的:
默认情况下,ViewState被序列化成一个Base64编码形式的字符串。在回发时,ViewState信息被加载并且被重新应用到控制层次的持久化状态中。
解决办法
这里有两种不同的方法可以阻止某人来解密ViewState的数据。
1.你可以使用"哈希码"来确保ViewState状态信息是'防篡改的'。你可以在你的页面中添加 EnableViewStateMAC=true指令属性来实现这个功能。MAC表示"消息认证码"。
当我们在ViewState保存期间使用EnableViewStateMac="True"属性,ASP.NET内部使用了一个哈希码。这个哈希码是强加密的校验和。这个添加伴随着ViewState内容并且存储在一个隐藏区域中。在回发期间,这个校验数据再一次被ASP.NET验证。如果那里面有一个不匹配,这个回发将会被拒绝。
2.第二个办法是在页面指令中设置 ViewStateEncryptionMode="Always" ,这将会加密ViewState的数据。你可以这样做:
ViewStateEncryptionMode 可以被设置成三种选项:
Always:一直加密ViewState。
Auto:如果一个控件被请求加密的时候才被加密。当这种情况发生时,这个控件必须调用Page.RegisterRequiresViewStateEncryption() 方法。
Never:从不加密ViewState。
如果你设置ViewStateEncryptionMode="Always" 为这种方式,并且尝试解密ViewState数据,你将会得到如下的信息:
我们也可以在web.config文件中设置EnableViewStateMAC 和 ViewStateEncryptionMode这样的属性,使其可用。
提示:如果不是必须的,应尽量避免ViewState加密,以免引起性能上的问题。如果你对ViewState比较陌生,请阅读我另外一篇关于ViewState的文章。Beginner's Guide to View State.
注释:初次翻译国外技术人员的文章,望大家多多批评、指正,谢谢!