预防查询语句数据库注入漏洞攻击
简单地说,Sql注入就是将Sql代码传递到应用程序的过程,但不是按照应用程序开发人员预定或期望的方式插入,相当大一部分程序员在编写代码的时候,并没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。这种漏洞并非系统照成,而是由程序员在编程中忽略了安全因素。Sql注入漏洞攻击原理就是利用非法参数获得敏感信息,收集整理,分析出管理员账号密码。
当开发应用程序时,尤其是有关数据库信息的查询,查询语句中可能会有拼接字符串注入漏洞,这便会导致用户资料泄露。那么该如何防范此类漏洞的出现。
Using(Sqlconnectioncn=newsqlconnection(连接字符串))
{
cn.open();
using(sqlcommandcmd=cn.creatcommand())
{
cmd.commandtext=select*fromT_tablewherename=’+textbox.text+’;
(此时如果在文本框中输入1’or‘1’=’1)就可以获取数据库信息。会造成信息的泄露。解决办法就是引入参数。方法如下。
cmd.commandtext=select*fromT_tablewherename=@Name;
cmd.Parameters.Add(newsqlParameter("@Name",textbox.text))};
这样查询数据就会从数据库查询比对,不会再出现注入漏洞攻击的情况。
}
}
stringstrSql="select*fromTableWhereUserName='"+textBoxUserName.Text+'"andUserPassord='"+textBoxPassword.Text+"'";
或者
stringstrSql=string.Format("select*fromTablewhereUserName='{0}'andUserPassword='{1}'",textBoxUserName.Text,textBoxPassword.Text);
在上面的语句中,对数据库操作的Sql语句使用字符串拼接的方式写的,这种方式是前期的程序员以及初学者通用的对数据库操作的一种Sql语句写法,上述代码中的textBoxUserName是用户在textBoxUserName文本框中提交的用户名,textUserpassword是用户在textUserpassword文本框中提交的密码,在理想的状态下,用户为了对系统进行攻击,用户(就是黑客)可能尝试篡改Sql语句,达到登录的目的。例如用户可能在用户名文本框中输入下面的语句:
1'or1=1--
下面我们把上面一行的语句代入到前面用于登录的Sql语句中,得到下面的Sql语句:
select*fromTablewhereUserId='1'or1=1--'andUserName=''
稍微学过数据库Sql语句的,很快就会发现上面一句话的不正常,这条Sql语句会返回Table表的全部数据,这就是黑客有机可乘的地方,黑客可以用这种方法成功登陆,还可以获取该Table表的所有信息。下面解释一下这句Sql语句:如果只有select*fromTable,就会返回该Table表的所有信息,where后是查询条件,1=1永远为True,不管User='1'为True还是为False,UserId='1'or1=1都为True。至于--'andUserName='',因为两个连字符(--)是MSSqlServer的注释标记(MySql和Oracle数据库也使用相同的技术,不过MySql使用的注释标记师是符号#,Oracle使用的是分号;),--后面的内容传到数据库查询时都被注释了,那么--后面的内容就没用了,Sql语句不会执行了,所以where后的查询条件永远为True,综上所述,上面的Sql查询语句会返回Table表的所有信息!
我们所能做的,如果不修改上面的Sql查询语句,那一种方法就是利用TextBox控件的MaxLength属性,这样就键入了黑客键入字符的数量,从而可以限制黑客向服务器发送大量的非法命令,但这种方法只是掩耳盗铃,治不了根本。第二种方法就是删除用户输入中的单引号,方法是在单引号后面加一个或多个单引号,或者利用空格替换单引号,这样就可以预防此类攻击。但局限性是如果用户的用户名或密码中就含有单引号呢,那就不可行了!
stringstrSql="select*fromTablewhereUserName=@UserNameandUserPassword=@UserPassword";
在该语句中,@UserName和@UserPassword就是参数名,可以使用以下语句为该参数传值:
SqlCommandcmd=newSqlCommand(strSql,conn);
SqlParameters[]pams=newSqlParameters(newSqlParameters("@UserName",textBoxUserName.Text),newSqlParameters("@UserPassword",textBoxPassword.Text));
cmd.Parameters.AddRange(pams);
参数名不区分大小写,这种方法也适宜存储过程和SqlDataAdapter对象。
我们在动态创建Sql语句中使用了@UserName和@UserPassword名称,而不是拼接多个字符串,这样就可以使用SqlCommand对象的Parameters集合传递值,该方法可以安全的创建动态Sql连接。参数在SqlServer内部不是简单的字符串替换,SqlServer直接0用添加的值进行数据比较,因此不会有Sql注入漏洞攻击。
-
打印机已连接但无法打印打印机连接正常打印没反应的解决方法打印机已连接但是无法打印什么原因
打印机不能打印的问题,还是有挺多原因的,想知道是什么原因造成的,要逐...
-
小米手机无法启动小米手机开不了机怎么办教你一招解决小米手机开不开机怎么回事求帮助
小米用户在使用过程中,可能会遇到手机开不了机的情况。这是怎么回事呢?...
-
海信电视不识别u盘apk电视无法识别u盘apk文件终极方法海信电视不识别u盘里的apk文件
近日,有用户反映自己在安装第三方软件时遇上了问题,电视识别不了apk...
-
地铁工作人员工资是多少
地铁的一线工作人员月工资差不多能在5000以上,公积金1500-25...
-
电脑一直正在启动windows怎么办电脑开机停留在启动界面怎么办电脑启动时一直停留在"正在启动windows"界面
很多时候,我们在打开电脑时,一开机,电脑进行开机启动画面就不动了,一...
- 最近发表
- 网站分类