最近好像很流行在ViewState上面玩花样,有人做了一个ViewState Decoder的东东,可以用软件直接解析出ViewState中的内容。
其实ViewState这个东东要解析出来的确不难,Paul Wilson(也就是做那个模仿ObjectSpaces的ORMapper的)写过一篇言简意赅的文章,里面就讲解了ViewState的结构,并提供了解析ViewState的例子。
这么看来ViewState其实还是很“脆弱”的,因为能够被很轻易的解析出来,所以很自然的会面临被恶意修改的问题。而且如果页面里面有一个DataGrid之类的控件,ViewState也会膨胀到令人不满意的地步。当然我们可以自己补足它的种种缺点。
MSDN上很早也有一篇讲解ViewState的文章,并且在文章里面说明了如何加强ViewState的安全性,包括将散列计算值附加在ViewState里面以保证不被篡改,还有给ViewState进行一些加密。
ViewState默认是保存在客户端页面的一个Hidden Field里面的,自然会增加下载页面和提交页面(别忘了这个Hidden Field里面的内容被下载回来以后,还要被原样的Postback回去)的时间,但干吗不把ViewState直接保存在服务器端呢?比如保存在服务器上的文件里面,或者SqlServer数据库里面,这样就完全的避免了使返回页面体积增大的问题。Dino Esposito在他著名的Cutting Edge专栏里面就写过这么一篇文章,讲解了如何透明的将ViewState保存在服务器端。
如果不想这么麻烦,还有其他方法,比如,将ViewState在服务器端压缩后再写到Hidden Field里面,传回到服务器后再解压缩,这样一样可以很有效的打压ViewState的体积。
当然,最最简单有效的方法,就是适当的使用控件的EnableViewState属性。