我们向一个测试页面中拽四个控件:一个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。
要防止出现上面的问题也很简单,只需在Button的OnClick事件处理代码中加入这么几行:
if (!Page.IsValid)
{
//Raise an error here
}
写了这么多,发现有点把这个小问题说得过于复杂化了:) 不过我个人感觉这可能是一个很容易忽视的问题,而且我觉得这也可以算是asp.net设计上的一个小缺陷,因为它违反了信息安全的一个很基本的原则:在默认情况下,凡是未明确规定允许的都应该被禁止。总之,写了这么多废话,也就希望能对大家有所帮助吧。