軟件測試 | 解碼ASP.NET的視圖狀態(tài)
問題
問題http://VP.NET提供了一種機制,通過這種機制,客戶端而不是服務器可以存儲狀態(tài)。即使相對較大的狀態(tài)對象(幾千字節(jié))也可以作為表單域發(fā)送,并由網頁瀏覽器在每次請求中發(fā)回。這被稱為視圖狀態(tài),存儲在表單名為__VIEWSTATE的輸入中。如果你的應用使用這個視圖狀態(tài),則需要研究業(yè)務邏輯對它的依賴方式,并圍繞著出錯的視圖狀態(tài)來開發(fā)測試。在你能夠對出錯的視圖狀態(tài)構建測試之前,必須了解視圖狀態(tài)在應用中的用法。
解決方案
從Fire Onion(http://www.pluralsight.com/tools.aspx)獲取ViewState Decoder。最簡單的使用方法是將應用的URL(或特定的頁面)復制并粘貼到URL框中。圖4-4顯示了ViewState Decoder2.1版以及它輸出的小型快照。
討論
有時程序不能從網頁中獲取視圖狀態(tài)。其實沒有問題,你只需要查看網頁的源代碼(參見3.2節(jié))并搜索<input type="hidden" name="__VIEWSTATE"...>。復制這個輸入的取值并粘貼到解碼器中。
假設圖4-4中的例子是你的應用,那么它就暗示了幾種可能的測試途徑。視圖狀態(tài)中有URL。它們可能包含JavaScript或將用戶定向到其他惡意網站嗎?不同的整數(shù)值又意味著什么?

如果你的應用使用http://ASP.NET和視圖狀態(tài),那么你應該問自己幾個與之相關的問題:
在服務器處理視圖狀態(tài)時,會將視圖狀態(tài)中的某些數(shù)據插入到后續(xù)頁面的URL或HTML中嗎?
現(xiàn)在來分析圖4-4中顯示的幾個URL。如果在這個應用中頁面導航鏈接是從視圖狀態(tài)生成的會怎么樣?黑客能夠通過向用戶發(fā)送假冒的視圖狀態(tài)來欺騙他們訪問惡意站點嗎?
視圖狀態(tài)時否受保護不會被篡改?
http://ASP.NET提供了幾種保護視圖狀態(tài)的方式。其中一種方式是簡單的散列值代碼,這樣如果視圖狀態(tài)有非預期的修改,服務器將能夠捕獲一個異常。另一種方式是一種加密機制,使得視圖狀態(tài)對客戶端和潛在的攻擊者不可見。
存在盲目地依賴于視圖狀態(tài)中的取值的程序邏輯嗎?
設想某個應用將用戶類型(普通用戶或管理員)存儲在ViewState中。攻擊者只需修改它就能夠更改自己的有效權限。
在需要為出錯的視圖狀態(tài)創(chuàng)建測試時,你很可能會用到像TamperData(參見3.6節(jié))或WebScarab(參見3.4節(jié))這樣的工具來注入新的取值。