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

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