原文: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.

 

注释:初次翻译国外技术人员的文章,望大家多多批评、指正,谢谢!

(译)如何在ASP.NET中安全使用ViewState的更多相关文章

  1. 【译】在Asp.Net中操作PDF – iTextSharp -利用块,短语,段落添加文本

    原文 [译]在Asp.Net中操作PDF – iTextSharp -利用块,短语,段落添加文本 本篇文章是讲述使用iTextSharp这个开源组件的系列文章的第三篇,iTextSharp可以通过As ...

  2. 【译】在Asp.Net中操作PDF - iTextSharp - 使用字体

    原文 [译]在Asp.Net中操作PDF - iTextSharp - 使用字体 紧接着前面我对iTextSharp简介博文,iTextSharp是一个免费的允许Asp.Net对PDF进行操作的第三方 ...

  3. 如何在ASP.Net中实现RSA加密

    在我们实际运用中,加密是保证数据安全的重要手段.以前使用ASP时,对数据加密可以使用MD5和SHA1算法,这两种算法虽然快捷有效,但是无法对通过它们加密的密文进行反运算,即是解密.因此需要解密数据的场 ...

  4. 【译】在Asp.Net中操作PDF - iTextSharp - 利用列进行排版

    原文 [译]在Asp.Net中操作PDF - iTextSharp - 利用列进行排版 在使用iTextSharp通过ASP.Net生成PDF的系列文章中,前面的文章已经讲述了iTextSharp所涵 ...

  5. 【译】在Asp.Net中操作PDF - iTextSharp - 绘制矢量图

    原文 [译]在Asp.Net中操作PDF - iTextSharp - 绘制矢量图 在上一篇iTextSharp文章中讲述了如何将现有的图片插入PDF中并对其进行操作.但有时,你需要在PDF中绘制不依 ...

  6. 【译】在Asp.Net中操作PDF – iTextSharp - 操作图片

    原文 [译]在Asp.Net中操作PDF – iTextSharp - 操作图片 作为我的iTextSharp系列的文章的第七篇,开始探索使用iTextSharp在PDF中操作图片,理解本篇文章需要看 ...

  7. 【译】在Asp.Net中操作PDF – iTextSharp - 使用表格

    原文 [译]在Asp.Net中操作PDF – iTextSharp - 使用表格 使用Asp.Net生成PDF最常用的元素应该是表格,表格可以帮助比如订单或者发票类型的文档更加格式化和美观.本篇文章并 ...

  8. 【译】在Asp.Net中操作PDF – iTextSharp - 使用链接和书签

    原文 [译]在Asp.Net中操作PDF – iTextSharp - 使用链接和书签 用户和PDF文档的交互可以通过锚(链接)和书签进行,接着我前面iTextSharp的系列文章,本篇文章主要讲通过 ...

  9. 【译】在Asp.Net中操作PDF – iTextSharp-列表

    原文 [译]在Asp.Net中操作PDF – iTextSharp-列表 在前文中,我们已经知道了如何利用iTextSharp创建PDF文档,设置字体样式和风格.本文开始讲述iTextSharp中的有 ...

随机推荐

  1. CodeForces 706C Hard problem (水DP)

    题意:对于给定的n个字符串,可以花费a[i]  将其倒序,问是否可以将其排成从大到小的字典序,且花费最小是多少. 析:很明显的水DP,如果不是水DP,我也不会做.... 这个就要二维,d[2][max ...

  2. Serializable 序列化为字符串 base64

    工具类 Base64.java import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import ja ...

  3. c++的操作符格式记录

    以下摘自维基百科,mark一下,以备不时之需. For the purposes of this table, a, b, and c represent valid values (literals ...

  4. Visifire的一些使用心得

    1.如何让图表的Y轴不从0开始显示:有时一系列的数据差别很小,如果从0开始显示,在Y轴上,会一堆数据都堆在某一个区间.例如期货的蜡烛图.将ViewportRangeEnabled设为true即可解决此 ...

  5. 如何彻底隐藏iOS7应用的status bar

    用xcode5开发新的iOS游戏,发现一个坑爹的现象,虽然我已经在info.plist里面把Status bar is initially hidden设置成了YES,但在设备上一跑还是看到丑陋的st ...

  6. 普通Jquery的ajax判断重复和formvalidator的ajaxValidator区别

    示例:1.ajax版: $("#txtTitle").blur(function () {                 $.ajax({                     ...

  7. PC/UVa 题号: 110104/706 LC-Display (液晶显示屏)题解

    #include <string> #include <iostream> #include <cstring> #include <algorithm> ...

  8. PyQt入门系列(一):Hello World

    开始搞PyQt了,顺便记录一下自己的学习!资料参考某大神的PyQt4 精彩实例分析,以及<征服Python>这本书. 下面是Demo: #-*- coding:utf-8 -*- #编码声 ...

  9. Wps的ppt里 让图片按顺序出现 就是点击一下 出现一张照片

    基本操作能够用两种方法来实现: 方法一.每页幻灯片插入一张图片,幻灯片默认就是单击鼠标切换幻灯片的,所以不用再做其它设置. 方法二.在一页幻灯片中插入多张图片,全选图片(插入图片后,点击图片,Ctrl ...

  10. BOOL,int,float,指针变量与零值比较的if语句

    1.注意这里说的是,与零值比较,而不是与零比较. 2.对于int类型,与零值比较就是: if(var == 0) //零值 3.对于bool类型,零值表示false,任何非零值表示true,因此使用: ...