如果做一个项目,涉及到一个网站的开发,站点需要大量的数据输入和填写各种的用户资料,一个兄弟对数据输入没有太上心,对输入的数据没有进行必要的处理和过滤。结果系统上线可怕的事情发生了,第一天站点出现了各种各样的错误,站点被数据撑的乱七八糟,HTML的数据把站点搞的面目全非,第二天站点管理员密码被修改,第三天…。日子还在继续…我可怜的兄弟开始焦头烂额一。
一.次攻击的例子
一般的web系统,包括ASP.NET开发的web系统都涉及到数据输入的功能,数据输入是一个在普通不过的操作,但对于一个黑客或者蓄意要破坏你系统的人来说,小小的数据输入的文本框里面蕴藏着很大的攻击系统的机会。
首先也从一个现象谈起,大家在编写ASP.NET系统的时候一般都要涉及到登陆,很多人是按照下面的方法来编写登陆代码的,我们结合sql语句来介绍。(这里涉及的sql语句以sql SERVER为准)。
- dataaccessb Db=new DataAccessB();
- if(db.select("select*from admin where name='"+Uername.Text+"'
and pwd='"+Password.Text+"'").Rows.Count<=0)- {
- response.write("<script>alert('用户名或密码错误')</script>");
- session["admin"]="0";
- }
- else
- {
- session["admin"]="1";
- server.transfer("manager.aspx");
- }
假如是上述的代码,如果侵入者使用一点点非常的技巧就可以轻松的得到一个导致数据库错误判断的sql语句,从而使系统把输入任何数据的人放入系统管理页面.
下面来看看到底做了哪些手脚?
攻击者只需要在用户名和密码处输入or 1=1,就可以使得系统得到一个错误的SQL语句,系统得到的错误语句如下:
"select*from admin where name='' OR 1=1 and pwd='' OR 1=1''通过这样恒成立的SQL语句就可以得到全部的数据,按照代码的判断,系统将认为有符合要求的数据,从而进入系统管理界面。
通过诸如此类的方法侵入者可以在任何一个要输入信息的窗体输入一些非法的数据从而进入需要密码才可以进入的系统,另外还可以通过在比如查询页,通过输入特定的字符得到一些机密的信息,等等。
通过上述的介绍,不难看出数据的输入是存在隐患的,如果设计的时候不考虑清楚,将来可是后患的.那如何来安全它们呢?
二.最易上手的三招
作为数据输入篇关键是解决数据输入安全性的问题,那么我们如何通过必要的手段来把数据输入这个环节做的尽可能的ASP.NET安全些呢?
1. 对数据库角色的管理
我们在使用ASP.NET连接数据库的时候,只要你不是使用指定角色,比如aspnet这个角色访问sql SERVER 2000,或者信任连接。那么都需要在数据库连接字串里面加上一个帐户。一般这个帐户都是SQL SERVER系统内开的一个帐户。在实际的部署过程中很多人都习惯性的把这个帐户的权限设置成系统管理员,或者对好几个库都可以操作的角色。这样带来的危险是一旦此帐号使用的系统被别人注入成功的话,别人将可以对数据库的一个库或者多个库发起攻击,造成难以挽回的损失。
建议一个系统一个帐户和权限。权限按照够用就行,越低越安全的准则。
2. 给系统加数据验证控件
结合上面的例子,其实只要开发的时候给我们的输入文本框简单的加一个验证控件就可以解决问题了。
另外还有一个办法就是对于综合性的数据殊输入我们可以通过string..replace()的方式来过滤掉一些诸如“‘= LIKE等等的敏感字符,使的输入的非法数据无法正常的被数据库所执行。
3.代码的正确写法
养成一个良好的数据库访问代码的正确写法,将帮助我们减少被数据输入攻击的机会。
利用参数的方式来访问操作数据库就是一个比较好的方式。结合前文提到的那个攻击例子,我们完全可以改造一些代码,使的ASP.NET安全性成倍的增加。
- sqldataadapter Auery_Ad = new SqlDataAdapter
("SELECT * FROM admin WHERE name = @user AND pwd=@pass", the_connection);- sqlparameter ParamUser = Auery_Ad.SelectCommand.Parameters.Add (>>
- "@user",sqldb.varchar,20);
- paramuser.value= uername.Text;
- sqlparameter ParamPwd = Auery_Ad.SelectCommand.Parameters.Add (>>
- "@ pass ",SqlDb.VarChar,20);
- parampwd.value= Password.Text;
最后就是要注意一下跨站攻击,跨站攻击目前在.net FRAMWORK1.1中也有所完善,一般在传递一些含有脚本字符的数据的时候,系统都会提示“发现潜在的危险脚本”来防止跨站的攻击。但这个方式也会妨碍我们平时的一些正常的操作和效果。
在web.config文件里面有如下的配置信息:
- <pages validateRequest="false" />
设置为true的话,系统将禁止html格式代码数据。
三.小结:
相信通过上述的规范编写和防范,一般常规的注入式攻击和数据输入安全是可以保证的了,每一个技术都有自己的特点,学会利用这里技术特点和特性就可以帮助我们解决很多的实际问题。ASP.NET安全代码的编写,是可以找到很多的现成技术和资料的。
【编辑推荐】