2011-10-01 55 views
2

本書的第123頁 - 第3章,第2課:它說: 「 Page.ViewState屬性提供了一個字典對象,用於保留 之間多個同一頁面的請求之間的值,該對象的類型爲StateBag。處理ASP.NET 頁面時,頁面及其控件的當前狀態被散列成一個字符串,並保存在頁面中作爲名爲__ViewState的HTML隱藏字段。如果單個字段的數據太長( 如Page.MaxPageStateFieldLength屬性中指定的那樣),ASP.NET執行 視圖狀態分塊,以將其分割到多個隱藏字段中。「MCTS 70-515培訓套件,查看狀態錯誤?

我對__ViewState隱藏字段的理解是,它存儲了與設計時相比已更改的控件的值。更何況,如果__ViewState是任何數據量的散列,它將永遠不會變得太大,因爲散列的大小是固定的。

這本書是否錯了?或者我在這裏丟失了什麼......

回答

1

Viewstate使用base-64進行編碼。

本書具有誤導性,因爲哈希是單向操作,稍後在服務器端進行解碼幾乎是不可能的。

你的理解也是錯誤的,viewstate不存儲與設計時值不同的值。基本上,它是在回發之間保持表單數據。有關詳細信息,請參閱msdn(http://msdn.microsoft.com/zh-cn/library/bb386448.aspx)。

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頁面框架可以測試 視圖狀態數據是否已被破壞或篡改。但是,即使 未被篡改,查看狀態數據仍可被攔截 並被惡意用戶讀取。

所以,要回答你的問題。

  • 散列已完成,但僅用於有效性目的。該段肯定是誤導性的。
  • 關於__ViewState,Dooh已提供以上鍊接