浅谈asp.net2.0验证控件的安全使用

    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设计上的一个小缺陷,因为它违反了信息安全的一个很基本的原则:在默认情况下,凡是未明确规定允许的都应该被禁止。总之,写了这么多废话,也就希望能对大家有所帮助吧。

posted @ 2008-01-23 19:55  Marco Zeng  阅读(738)  评论(3编辑  收藏  举报