asp.net驗證控制項以其強大的功能得到了很廣泛的使用,但如果對其使用不得當也很容易帶來安全隱患。前段時間由於作業需要稍微瞭解了下它的驗證策略,在此也提醒下大家這個問題:這些驗證控制項預設情況下只對使用者輸入進行用戶端驗證,而伺服器端驗證的代碼必須手動添加。下面我們就來具體看看如何繞過預設情況下的用戶端驗證向伺服器提交非法資料:
我們向一個測試頁面中拽四個控制項:一個Label、一個TextBox、一個RequiredFieldValidator以及一個Button。其中RequiredFieldValidator是用來驗證TextBox控制項的。Button的onclick事件的響應代碼也很簡單(這裡沒有加入伺服器端驗證的代碼):
protected void Button1_Click(object sender, EventArgs e)
{
if (this.TextBox1.Text == null || this.TextBox1.Text == "")
this.Label1.Text = "input value is empty";
}
我們預期的情況是:由於有RequiredFieldValidator控制項的驗證,所以向伺服器提交的TextBox的值不可能為空白,所以Label也不可能顯示為"input value is empty"。但事實上,上述做法卻存在一個漏洞,使我們可以向伺服器提交一個空的TextBox:
運行程式後我們可以得到一個頁面,把它存為html文檔,用記事本開啟,並做如下修改:
function WebForm_OnSubmit() {
if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false)
return false;
return true;
}
改為:
function WebForm_OnSubmit() {
//跳過執行用戶端驗證的js代碼
return true;
}
<FORM id=form1 name=form1 onsubmit="javascript:return WebForm_OnSubmit();"
action=Validator.aspx method=post>
中action屬性改成完整的提交url。
做完這些我們再用ie開啟這個儲存下來的html檔案。在Textbox中不輸入任何值得情況下直接點擊Button提交頁面,然後就可以看到label中顯示了我們所預期的內容:input value is empty 證明我們成功地繞過了用戶端javascript的驗證。
要防止出現上面的問題也很簡單,只需在Button的OnClick事件處理代碼中加入這麼幾行:
if (!Page.IsValid)
{
//Raise an error here
}
寫了這麼多,發現有點把這個小問題說得過於複雜化了:) 不過我個人感覺這可能是一個很容易忽視的問題,而且我覺得這也可以算是asp.net設計上的一個小缺陷,因為它違反了資訊安全的一個很基本的原則:在預設情況下,凡是未明確規定允許的都應該被禁止。總之,寫了這麼多廢話,也就希望能對大家有所協助吧。