当前位置: 移动技术网 > 科技>软件教程>编程开发 > 预防查询语句数据库注入漏洞攻击

预防查询语句数据库注入漏洞攻击

2013年09月25日  | 移动技术网科技  | 我要评论
预防查询语句数据库注入漏洞攻击

简单地说,sql注入就是将sql代码传递到应用程序的过程,但不是按照应用程序开发人员预定或期望的方式插入,相当大一部分程序员在编写代码的时候,并没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。这种漏洞并非系统照成,而是由程序员在编程中忽略了安全因素。sql注入漏洞攻击原理就是利用非法参数获得敏感信息,收集整理,分析出管理员账号密码。

当开发应用程序时,尤其是有关数据库信息的查询,查询语句中可能会有拼接字符串注入漏洞,这便会导致用户资料泄露。那么该如何防范此类漏洞的出现。

可以为查询语句设置参数,方法实例如下面所示

using(sqlconnection cn = new sqlconnection(“连接字符串”))

{

cn.open();

using(sqlcommand cmd = cn.creatcommand())

{

cmd.commandtext=”select * from t_table where name=’”+textbox.text+”’”;

(此时如果在文本框中输入1’ or ‘1’=’1)就可以获取数据库信息。会造成信息的泄露。解决办法就是引入参数。方法如下。

cmd.commandtext=”select * from t_table where name=@name”;

cmd.parameters.add (new sqlparameter ("@name", textbox.text))};

这样查询数据就会从数据库查询比对,不会再出现注入漏洞攻击的情况。

}

}

每一次必不可少的会写对数据库操作的sql语句,例如以下验证登陆的sql语句:

string strsql="select * from table where username='"+textboxusername.text+'"and userpassord='"+textboxpassword.text+"'";
或者
string strsql=string.format("select * from table where username='{0}' and userpassword='{1}'",textboxusername.text,textboxpassword.text);
在上面的语句中,对数据库操作的sql语句使用字符串拼接的方式写的,这种方式是前期的程序员以及初学者通用的对数据库操作的一种sql语句写法,上述代码中的textboxusername是用户在textboxusername文本框中提交的用户名,textuserpassword是用户在textuserpassword文本框中提交的密码,在理想的状态下,用户 为了对系统进行攻击,用户(就是黑客)可能尝试篡改sql语句,达到登录的目的。例如用户可能在用户名文本框中输入下面的语句:
1' or 1=1 --

下面我们把上面一行的语句代入到前面用于登录的sql语句中,得到下面的sql语句:
select * from table where userid='1' or 1=1 --'and username=' '
稍微学过数据库sql语句的,很快就会发现上面一句话的不正常,这条sql语句会返回table表的全部数据,这就是黑客有机可乘的地方,黑客可以用这种方法成功登陆,还可以获取该table表的所有信息。下面解释一下这句sql语句:如果只有select * from table,就会返回该table表的所有信息,where后是查询条件,1=1永远为true,不管user='1'为true还是为false,userid='1' or 1=1 都为true。至于--'and username=' ' ,因为两个连字符(--)是ms sql server的注释标记(my sql和oracle数据库也使用相同的技术,不过my sql使用的注释标记师是符号#,oracle使用的是分号;),--后面的内容传到数据库查询时都被注释了,那么--后面的内容就没用了,sql语句不会执行了,所以where后的查询条件永远为true,综上所述,上面的sql查询语句会返回table表的所有信息!

通过这种sql语法漏洞,黑客们可以达到他们的目的,但sql注入漏洞攻击绝对不止这一种,复杂的还有很多,我不在说了。下面我谈一下我知道在.net中应对上面这种sql注入攻击的防范措施。
我们所能做的,如果不修改上面的sql查询语句,那一种方法就是利用textbox控件的maxlength属性,这样就键入了黑客键入字符的数量,从而可以限制黑客向服务器发送大量的非法命令,但这种方法只是掩耳盗铃,治不了根本。第二种方法就是删除用户输入中的单引号,方法是在单引号后面加一个或多个单引号,或者利用空格替换单引号,这样就可以预防此类攻击。但局限性是如果用户的用户名或密码中就含有单引号呢,那就不可行了!

最完美的一种方法就是使用ado.net command对象的参数集合,在前面的可以进行sql注入漏洞攻击的sql语句中,通过使用字符串拼接方法动态创建查询,在这里我们可以利用ado.net command的对象的parameters属性提供的功能,传递执行sql语句所使用的参数,在这种方法中参数名必须以字符@为前缀,例如以下sql查询语句:
string strsql="select * from table where username=@username and userpassword=@userpassword";
在该语句中,@username和@userpassword就是参数名,可以使用以下语句为该参数传值:
sqlcommand cmd=new sqlcommand(strsql,conn);
sqlparameters[] pams=new sqlparameters(new sqlparameters("@username",textboxusername.text),new sqlparameters("@userpassword",textboxpassword.text));
cmd.parameters.addrange(pams);
参数名不区分大小写,这种方法也适宜存储过程和sqldataadapter对象。

我们在动态创建sql语句中使用了@username和@userpassword名称,而不是拼接多个字符串,这样就可以使用sqlcommand对象的parameters集合传递值,该方法可以安全的创建动态sql连接。参数在sql server内部不是简单的字符串替换,sql server直接0用添加的值进行数据比较,因此不会有sql注入漏洞攻击。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网