最近客戶做過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 欄位。如下圖,
透過 __VIEWSTATEGENERATOR keyword 找到了,Farewell, EnableViewStateMac!
為了加強安全性,不再讓AP將EnableViewStateMac設成false(設了也沒用,一律使用true)。
詳細可以參考technet的篇文章「不安全的 ASP.NET 網站設定可能會允許權限提高」,還有列出相關的KB。
而看了我們公司的環境,在 Windows 2003 上了 KB 2894845,將它移除重開機後再執行程式,程式運作就正常了。
但這是安全性更新,是加強系統的安全性。所以就看一下程式的運作方式。
在程式中,判斷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後,系統運作有些問題的話,可以參考看看哦!
參考資料
Microsoft 資訊安全諮詢:不安全的 ASP.NET 網站組態可能會允許權限提高
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^