原文: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. CPU与内存(经典问答)

    原文:http://www.cnblogs.com/xkfz007/archive/2012/10/08/2715163.html 下面是网上看到的一些关于内存和CPU方面的一些很不错的文章. 整理如 ...

  2. EasyUI datetimebox设置默认值为当前时间

    设置value="${notices.release_time}" <input class="easyui-validatebox easyui-datetime ...

  3. HttpWebRequest和HttpWebResponse用法小结

    http://www.cnblogs.com/willpan/archive/2011/09/26/2176475.html http://www.cnblogs.com/lip0121/p/4539 ...

  4. OpenStack API 与 CloudStack API 模块比较

    OpenStack API Block Storage Service API Compute API Compute API extensions Identity Service API and ...

  5. iPhone Push消息全攻略.1

    要做一个iPhone Push消息的需求,从简单test的开始. 1.先添加一个app ID 2.点击Edit来配置push服务. 3.生成两个证书,一个用于开发,一个用于发布. 4.按下图操作创建一 ...

  6. Unity3D-Baked Lightmapping 示例学习

    首先,看一下摄像机的Rendering Paths http://game.ceeger.com/Manual/RenderingPaths.html 可以看出,对于灯光的渲染质量 Deferred ...

  7. PL/pgSQL的 RETURN NEXT例子

    从网上找到例子: 可以说,RETURN NEXT要用在循环中: 例子一: 数据准备: CREATE TABLE foo (fooid INT, foosubid INT, fooname TEXT); ...

  8. char指针

    1.在C语言中,没有字符串类型,因此使用char指针表示字符串. 2.那么问题来了,使用char* 表示字符串,到哪里是结尾呢?因此需要一个特殊的字符作为哨兵,类似迭代器中的end(),这个哨兵就是' ...

  9. &lt;Android&gt;关于EditText中setInputType和setSingleLine的冲突

    近期自己开发了一个带有删除button的EditText,一方面须要设置为SingleLine,还有一方面又须要设置输入类型,起先在xml文件里设置了android:inputType类型,在自己定义 ...

  10. 【模式识别】Learning To Rank之RankBoost

    RankBoost的思想比較简单,是二元Learning to rank的常规思路:通过构造目标分类器,使得pair之间的对象存在相对大小关系.通俗点说,把对象组成一对对的pair,比方一组排序r1& ...