在 ASP.NET 中,如何使ViewState安全

分享于 

3分钟阅读

Web开发

  繁體

介绍

ASP.NET ViewState是一种客户端状态管理机制,ViewState存储在ID为__VIEWSTATE的隐藏字段中,通常,存储的ViewState信息如下所示:

看起来像一个加密的string,这只是Base64编码的string,不是加密的string,因此可以轻松解码。

使用Base64编码的主要原因如下:

  • Base64使string适合HTTP传输
  • 让阅读变得更难
  • 尝试使用string解码ViewState解码器(由Fritz Onion创建的好工具)。

    在解码string之后,我们可以看到存储在ViewState内部的确切数据。

    你可以编写几行代码来解码文本,并获得实际的视图状态信息。

    以下是ViewState的工作原理:

    默认情况下,ViewState被序列化为Base-64编码的string,在postback上,ViewState信息被加载,并重新应用于控件层次结构中控件的持久状态。

    解决方案

    有两种不同的方法可以防止某人解密ViewState数据。

    使用EnableViewStateMac="True"时,在ViewState save期间,ASP.NET在内部使用哈希代码,此哈希代码是加密的强校验和,这与ViewState内容一起添加并存储在隐藏文件中,在postback期间,校验和数据再次由ASP.NET验证,如果不匹配,将拒绝postback。

  • 您可以使用"哈希码"来确保ViewState信息是防篡改的。可以通过在page指令中添加EnableViewStateMAC=true来实现,MAC代表"消息验证码"
  • 第二个选项是使用页面指令设置ViewStateEncryptionMode="Always",这将加密ViewState数据,你可以这样做:
  • ViewStateEncryptionMode有三个不同的选项可以设置:

  • Always:加密ViewState始终
  • Auto:如果控件请求加密,就加密,为了实现这个,控件必须调用 Page.RegisterRequiresViewStateEncryption() 方法方法方法
  • Never:从不加密ViewState
  • 如果设置ViewStateEncryptionMode="Always",并尝试解码ViewState数据,你会得到如下所示的信息:

    可以为EnableViewStateMACViewStateEncryptionMode在web.config中启用这些设置:

    注:如果不需要ViewState加密,请尝试避免它,因为它可能导致性能问题。


    asp  asp-net  VIEW  MAKE  secure  查看