手机版

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

时间:2021-08-01 来源:互联网 编辑:宝哥软件园 浏览:

类型:编程控件大小:5.9M语言:中文评分:7.5标签:立即下载。简而言之,Sql注入是将Sql代码传输到应用程序的过程,但它不是以应用程序开发人员预期或期望的方式插入的。相当一部分程序员在编写代码时没有判断用户输入数据的合法性,使得应用存在安全隐患。这种漏洞不是系统造成的,而是程序员在编程时忽略了安全因素。Sql注入漏洞攻击的原理是利用非法参数获取敏感信息,收集分析管理员账号密码。

开发应用程序时,尤其是数据库信息的查询,查询语句中可能存在串联字符串注入的漏洞,导致用户数据的泄露。那么如何防止此类漏洞的出现。

您可以为查询语句设置参数,方法示例如下:

使用(sqlconnectioncn=new sqlconnection("连接字符串"))

{

cn . open();

使用(sqlcommand cmd=cn.creatcommand())

{

cmd.commandtext=" select * from T _ table,其中name=' " textbox.text

(此时,如果在文本框中输入1 '或' 1'=' 1 ',就可以获得数据库信息。会造成信息泄露。解决办法是引入参数。方法如下。

cmd.commandtext="从T_table中选择*其中Name=@ Name ";

cmd。参数。添加(新的sqlParameter ('@Name ',textbox . text))};

这样就可以从数据库中查询比较查询数据,不会再出现注入漏洞的情况。

}

}

每次都需要编写用于数据库操作的Sql语句,例如以下用于验证登录的Sql语句:

字符串strSql='从表中选择*其中用户名=' '文本框用户名。文本“”和用户密码=“”文本框密码。文本' ';或string strsql=string.format('从表中选择*其中用户名=' {0} '和用户密码=' {1} ',textboxusername.text,textbox password . text);在上面的语句中,数据库操作的Sql语句是以字符串拼接的形式编写的,是程序员和初学者在前期常用的数据库操作的Sql语句编写方法。上面代码中的文本框用户名是用户在文本框用户名文本框中提交的用户名。文本用户密码是用户在文本用户密码文本框中提交的密码。在理想状态下,为了攻击系统,用户(即黑客)可能会试图篡改Sql语句来达到登录的目的。例如,用户可以在用户名文本框中输入以下语句:1 '或1=1-

让我们将上一行中的语句替换为用于登录的Sql语句,并获得以下Sql语句:从表中选择*其中userid=' 1 '或1=1-'和username=' '。如果稍微研究一下数据库Sql语句,很快就会发现上面这句话是不正常的。这个Sql语句将返回表的所有数据,这是黑客可以利用的地方。黑客可以通过这种方式成功登录,获得表的所有信息。下面解释一下这个Sql语句:如果只选择了表中的select *将返回表的所有信息,其中后面是查询条件,1=1始终为True,无论User='1 '是True还是False,UserId='1 '还是1=1都为True。至于“-”和username=“”,因为两个连字符(-)是MS Sql Server的注释标记(My Sql和Oracle数据库也使用同样的技术,但是My Sql使用的注释标记是符号#,Oracle使用分号;),-以下内容传输到数据库查询时会被注释,那么-以下内容没有用,不会执行Sql语句,所以where后的查询条件始终为True。综上所述,上面的Sql查询语句将返回Table表的所有信息!

黑客可以通过这个Sql语法漏洞达到目的,但绝对不止这种Sql注入漏洞攻击,复杂的还有很多,我就不多说了。我来说说我所知道的应对上述Sql注入攻击的防范措施。NET。我们能做的,如果不修改上面的Sql查询语句,就是使用TextBox控件的MaxLength属性,这样就可以键入黑客键入的字符数,这样可以限制黑客向服务器发送大量非法命令。然而,这种方法只是一种掩饰。第二种方法是通过在单引号后添加一个或多个单引号,或者用空格替换单引号来删除用户输入中的单引号,以防止此类攻击。但限制是如果用户名或密码包含单引号,是不可行的!

最完美的方法是使用ADO.NET命令对象的参数集,并使用以前的Sql语句中的字符串拼接方法动态创建查询,该方法可能会受到Sql注入漏洞的攻击。在这里,我们可以使用ADO.NET命令对象的Parameters属性提供的函数来传递用于执行Sql语句的参数。在此方法中,参数名必须以字符@(如以下Sql查询语句)为前缀:string strsql=' select * from table,其中username=@ username和user password=@ user password ';在这个语句中,@UserName和@UserPassword是参数名,可以使用下面的语句传递这个参数的值:sqlcommandcmd=new sqlcommand(strsql,conn);SqlParameters[]pams=new SqlParameters(new SqlParameters(' @ UserName ',textBoxUserName。文本),新的SqlParameters('@UserPassword ',textBoxPassword。文本));cmd。参数。AddRange(pams);参数名不区分大小写,此方法也适用于存储过程和SqlDataAdapter对象。

在动态创建Sql语句时,我们使用名称@UserName和@UserPassword,而不是拼接多个字符串,因此可以使用SqlCommand对象的Parameters集合来传递值,这种方法可以安全地创建动态Sql连接。参数并不是简单地用Sql Server内部的字符串来代替,Sql Server直接将数据与添加的值进行比较,因此不会出现Sql注入漏洞攻击。

版权声明:防止查询语句数据库注入漏洞攻击是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。

相关文章推荐