惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 叶小钗
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Microsoft Security Blog
Microsoft Security Blog
罗磊的独立博客
大猫的无限游戏
大猫的无限游戏
美团技术团队
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
aimingoo的专栏
aimingoo的专栏
腾讯CDC
WordPress大学
WordPress大学
Apple Machine Learning Research
Apple Machine Learning Research
F
Fortinet All Blogs
G
Google Developers Blog
MongoDB | Blog
MongoDB | Blog
Microsoft Azure Blog
Microsoft Azure Blog
小众软件
小众软件
Engineering at Meta
Engineering at Meta
博客园_首页
B
Blog RSS Feed
D
Docker
M
MIT News - Artificial intelligence
爱范儿
爱范儿
I
InfoQ

博客园 - 水冰月

不要认为停留在心灵的舒适区域 成功不需要时间 只要你坚持 淘宝 世界名校的课件[转校内] 标题 javascript操作Select标记中options集合 七个受用一生的心理寓言 一辈子都有用的的75句话 完美的自己 一生中无能为力的10件事 xsd验证xml Javascript脚本和asp.net验证控件同时验证的代码 远程桌面“中断”巧解决 当DataSet为空时也显示GridView的表头(vs05) - 水冰月 - 博客园 收集一些.NET开发资源站点和部分优秀.NET开源项目 XP实用技巧:恢复"显示桌面"按钮 在IE7.0中如何设置代理 Win 2003 Server重新安装Oracle9i 在windows xp环境下如何完全卸载 oracle9i
浅谈asp.net2.0验证控件的安全使用
水冰月 · 2008-09-25 · via 博客园 - 水冰月

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