zoukankan      html  css  js  c++  java
  • (译)如何在ASP.NET中安全使用ViewState

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

     

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

  • 相关阅读:
    1049.(*) Counting Ones
    1135(重、错)Is It A Red-Black Tree
    3、如何判断一棵树是否是红黑树?
    2、以自定义struct或struct指针作为map的Key
    1、(★、※)如何判断一棵树是否是完全二叉树?
    1123.(重、错)Is It a Complete AVL Tree
    160819流水账
    150819流水账
    140819流水账
    130819流水账
  • 原文地址:https://www.cnblogs.com/zhaox583132460/p/3413629.html
Copyright © 2011-2022 走看看