在本书的第123页 - 第3章,第2课。它说: “ Page.ViewState属性提供了一个字典对象,用于保留其间的值 对同一页面的多个请求。此对象的类型为StateBag。当一个ASP.NET 处理页面,页面的当前状态及其控件被散列成一个字符串和 在页面中保存为名为__ViewState的HTML隐藏字段。如果数据太长了 ASP.NET执行单个字段(在Page.MaxPageStateFieldLength属性中指定) 查看状态块以将其分割为多个隐藏字段。“
我对__ViewState隐藏字段的理解是,它存储了与设计时相比更改的控件值。更不用说如果__ViewState是任何数据量的散列,它将永远不会变得太大,因为散列的大小是固定的。
这本书错了吗?或者我在这里错过了一些东西......答案 0 :(得分:1)
Viewstate使用base-64编码。
本书具有误导性,因为散列是单向操作,以后很难在服务器端对其进行解码。
您的理解也是错误的,viewstate不存储与设计时值不同的值。基本上,它是在回发之间保持表单数据。有关详细信息,请参阅msdn(http://msdn.microsoft.com/en-us/library/bb386448.aspx)。
答案 1 :(得分:1)
我也在使用同一本书学习这门考试。该特定行似乎与以下文章中的信息相似
http://msdn.microsoft.com/en-us/library/ie/75x4ha6s.aspx
处理页面时,页面和控件的当前状态 被散列成一个字符串并作为隐藏字段保存在页面中,或 如果存储在ViewState中的数据量,则隐藏多个字段 属性超过MaxPageStateFieldLength中的指定值 属性。当页面回发到服务器时,页面将解析 页面初始化和恢复属性时的视图状态字符串 页面中的信息。
但是,如果你在MSDN的其他地方挖掘,可以得到以下解释,这是准确的。
http://msdn.microsoft.com/en-us/library/ie/bb386448.aspx
默认情况下,视图状态数据存储在页面中的隐藏字段中 并使用base64编码进行编码。另外,视图的哈希 通过使用机器身份验证从数据创建状态数据 代码(MAC)密钥。散列值被添加到编码的视图状态数据 并且结果字符串存储在页面中。当页面是 发回服务器,ASP.NET页面框架重新计算 哈希值并将其与视图状态中存储的值进行比较。如果 哈希值不匹配,引发异常表示 查看状态数据可能无效。
通过创建哈希值,ASP.NET页面框架可以测试是否 视图状态数据已损坏或被篡改。但是,甚至 如果没有被篡改,视图状态数据仍然可以被截获 并被恶意用户阅读。
所以,回答你的问题。