現象:基類 PageBase 在 Page_Load 驗證權限,但子類頁面的 Page_Load 卻**先於**基類執行,導致未驗證即執行業務邏輯,存在安全隱患。
Page_Load 是透過 OnInit 註冊到 Load 事件的:this.Load += Page_Load;OnInit 先註冊自己的 Page_Load,再呼叫 base.OnInit(),導致子類處理器在委派鏈**前面**,優先執行。public class PageBase : Page
{
protected override void OnLoad(EventArgs e)
{
// 1. 先驗證
if (!ValidateUser())
{
Response.Redirect("Login.aspx");
return;
}
// 2. 再觸發 Load 事件(含子類 Page_Load)
base.OnLoad(e);
}
}
原理:Load 事件是在 OnLoad 中引發(base.OnLoad 內部呼叫 OnLoad(EventArgs.Empty)),在 base.OnLoad 前攔截即可保證先執行驗證。
public class ChildPage : PageBase
{
override protected void OnInit(EventArgs e)
{
base.OnInit(e); // 先讓基類註冊 Page_Load
// 再做子類初始化
InitializeComponent();
}
}
缺點:需強制所有子類遵守此規範,易遺漏。
OnLoad 集中處理驗證、日誌、通用資料載入。Page_Load,不覆寫 OnInit/OnLoad。OnPreInit、OnInit、OnInitComplete 等更早期事件。