[ASP.NET]為什麼ASP.NET WebForm程式多了「__VIEWSTATEGENERATOR」欄位? KB 2905247

最近客戶做過Windows Update後,我們公司的「死狗比爾」產品中某些功能居然不能Work了!
從.NET 1.1 (Windows 2003) 到 .NET 3.5(Windows 2008)的都是這樣子的狀況!
透過 Fiddler 比較2個Request發現,不能Work的裡面多了 __VIEWSTATEGENERATOR 欄位

最近客戶做過Windows Update後,我們公司的「死狗比爾」產品中某些功能居然不能Work了!

從.NET 1.1 (Windows 2003) 到 .NET 3.5(Windows 2008)的都是這樣子的狀況!

透過 Fiddler 比較2個Request發現,不能Work的裡面多了 __VIEWSTATEGENERATOR 欄位。如下圖,

image

 

透過 __VIEWSTATEGENERATOR keyword 找到了,Farewell, EnableViewStateMac!

為了加強安全性,不再讓AP將EnableViewStateMac設成false(設了也沒用,一律使用true)。

詳細可以參考technet的篇文章「不安全的 ASP.NET 網站設定可能會允許權限提高」,還有列出相關的KB。

而看了我們公司的環境,在 Windows 2003 上了 KB 2894845,將它移除重開機後再執行程式,程式運作就正常了。

image

 

但這是安全性更新,是加強系統的安全性。所以就看一下程式的運作方式。

在程式中,判斷IsPostBack = false 時,就取得資料放到Session之中,之後的PostBack就取自該Session來運作。

但,前面錄到的Request,第一次開啟程式時,卻有送 ViewState 相關欄位過去!  這會讓程式誤以為是 PostBack !

所以就沒有取得資料將它放到Session之中,所以程式運作就有問題。

於是,找到控制Submit的JS,將Form中的 ViewState 欄位設定成 disabled  , 再 Submit,這樣程式運作就正常了。

var objForm = document.FrmDataAll;
if (objForm) {
	var hid__VIEWSTATE = objForm.elements['__VIEWSTATE'];
	var hid__EVENTARGUMENT = objForm.elements['__EVENTARGUMENT'];
	var hid__EVENTTARGET = objForm.elements['__EVENTTARGET'];
	if (hid__VIEWSTATE) {
		hid__VIEWSTATE.disabled = true;
	}
	if (hid__EVENTARGUMENT) {
		hid__EVENTARGUMENT.disabled = true;
	}
	if (hid__EVENTTARGET) {
		hid__EVENTTARGET.disabled = true;
	}
}

 

所以如果最近上過Windows Update後,系統運作有些問題的話,可以參考看看哦!

 

參考資料

Farewell, EnableViewStateMac

不安全的 ASP.NET 網站設定可能會允許權限提高

Microsoft 資訊安全諮詢:不安全的 ASP.NET 網站組態可能會允許權限提高

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^