今天碰到一個奇怪的現象,當使用者在網頁上快速點擊按鈕或其他會導致 postback 的動作時(即每次 request 還沒來得急接收到 response 就又再點其它按鈕),會發生 Invalid postback or callback argument 錯誤。原始訊息為:

無效的回傳或回呼引數。已在組態中使用 或在網頁中使用 啟用事件驗證。基於安全性理由,這項功能驗證回傳或回呼引數是來自原本呈現它們的伺服器控制項。如果資料為有效並且是必需的,請使用 ClientScriptManager.RegisterForEventValidation 方法註冊回傳或回呼資料,以進行驗證。
於 System.Web.UI.ClientScriptManager.ValidateEvent(String uniqueId, String argument) 於 System.Web.UI.Control.ValidateEvent(String uniqueID, String eventArgument) 於 System.Web.UI.HtmlControls.HtmlAnchor.RaisePostBackEvent(String eventArgument) 於 System.Web.UI.HtmlControls.HtmlAnchor.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) 於 System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) 於 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) 於 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

ASP.NET 2.0 新增了一個網頁安全檢查的機制,當它發現 postback 資料不是原始的控制項發出來的,就會出現這個錯誤。如果網頁上有一些特殊的寫法會去修改 postback 資料,也會出現這個錯誤訊息。這種情況的解決方法有兩個,一個是呼叫  ClientScriptManager.RegisterForEventValidation,另一個是直接將網頁的 EnableEventValidation 設定為 false(或修改 web.config 的 pages 元素),當然,第二種方法是比較不安全的。

可是我的網頁並沒有寫特殊的程式碼去修改 postback 資料,也可以確定沒有駭客從中攔截篡改 postback 資料。實際測試之後發現,可以確定是 user 一直快速猛點網頁造成的。Hmm...蠻詭異的現象....