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

简单地说,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注入漏洞攻击。

时间: 2024-08-03 06:19:24

预防查询语句数据库注入漏洞攻击的相关文章

关于MYSQL语句存在注入漏洞的写法

               SQL Injection with MySQL 本文作者:angel 文章性质:原创 发布日期:2004-09-16 本文已经发表在<黑客防线>7月刊,转载请注明.由于写了很久,随着技术的进步,本人也发现该文里有不少错误和罗嗦的地方.请各位高手看了不要笑.本文写于<Advanced SQL Injection with MySQL>之前一个月. 声明 本文仅用于教学目的,如果因为本文造成的攻击后果本人概不负责,本文所有代码均为本人所写,所有数据均经过

数据库下载漏洞攻击技术

攻击|数据|数据库|下载 作为脚本漏洞的头号杀手锏--数据库下载漏洞,现在已经被越来越多的人所熟知.在这个信息化技术更新飞快的时代,漏洞产生后随之而来的就是各种应对的招数,比如改数据库的后缀.修改数据库的名字等等.很多人以为只要这么做就可以解决问题了,但事实往往不如你我所愿,即使你这么做了也难逃被高手攻击的命运.为此我们有必要去了解一些攻击的手法,来增强自己的安全技能. 1.强制下载后缀名为ASP.ASA的数据库文件 大多数的网管为了节省时间,网站上的文章系统.论坛等程序都是直接下载别人的源程序

PHP代码网站防范SQL注入漏洞攻击的建议

所有的网站管理员都会关心网站的安全问题.说到安全就不得不说到SQL注入攻击(SQL Injection).黑客通过SQL注入攻击可以拿到网站数据库的访问权限,之后他们就可以拿到网站数据库中所有的数据,恶意的黑客可以通过SQL注入 功能篡改数据库中的数据甚至会把数据库中的数据毁坏掉.做为网络开发者的你对这种黑客行为恨之入骨,当然也有必要了解一下SQL注入这种功能方式的原理并 学会如何通过代码来保护自己的网站数据库.今天就通过PHP和MySQL数据库为例,分享一下我所了解的SQL注入攻击和一些简单的

利用脚本注入漏洞攻击ReactJS应用程序

ReactJS是一款能够帮助开发者构建用户接口的热门JavaScript库.在它的帮助下,开发者可以构建出内容丰富的客户端或Web应用,并且提前加载内容以提供更好的用户体验. 从设计角度来看,只要你能够按照开发标准来使用ReactJS的话,它其实是非常安全的.但是在网络安全领域中,没有任何东西是绝对安全的,而错误的编程实践方式将导致类似脚本注入漏洞之类的问题产生,这些错误的编程方式包括: 1.利用用户提供的对象来创建React组件; 2.利用用户提供的href属性来配置标签,或利用其他可注入的属

PHP代码网站如何防范SQL注入漏洞攻击建议分享_php技巧

黑客通过SQL注入攻击可以拿到网站数据库的访问权限,之后他们就可以拿到网站数据库中所有的数据,恶意的黑客可以通过SQL注入功能篡改数据库中的数据甚至会把数据库中的数据毁坏掉.做为网络开发者的你对这种黑客行为恨之入骨,当然也有必要了解一下SQL注入这种功能方式的原理并学会如何通过代码来保护自己的网站数据库.今天就通过PHP和MySQL数据库为例,分享一下我所了解的SQL注入攻击和一些简单的防范措施和一些如何避免SQL注入攻击的建议. 什么是SQL注入(SQL Injection)? 简单来说,SQ

MySQL数据库下载漏洞攻击技术

作为脚本漏洞的头号杀手锏--数据库下载漏洞,现在已经被越来越多的人所熟知.在这个信息化技术更新飞快的时代,漏洞产生后随之而来的就是各种应对的招数,比如改数据库的后缀.修改数据库的名字等等.很多人以为只要这么做就可以解决问题了,但事实往往不如你我所愿,即使你这么做了也难逃被高手攻击的命运.为此我们有必要去了解一些攻击的手法,来增强自己的安全技能. 1.强制下载后缀名为ASP.ASA的数据库文件 大多数的网管为了节省时间,网站上的文章系统.论坛等程序都是直接下载别人的源程序再经过部分修改后使用的.而

数据库分页查询语句数据库查询_数据库其它

先看看单条 SQL 语句的分页 SQL 吧. 方法1: 适用于 SQL Server 2000/2005 SELECT TOP 页大小 * FROM table1 WHERE id NOT IN ( SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id ) ORDER BY id 方法2: 适用于 SQL Server 2000/2005 SELECT TOP 页大小 * FROM table1 WHERE id > ( SELECT ISNULL(M

永不落幕的数据库注入攻防战

本文根据DBAplus社群第98期线上分享整理而成.   讲师介绍 主题简介: 1.数据库有什么安全问题 2.何为数据库注入 3.数据库注入攻击实战 4.为什么会发生数据库注入 5.数据库注入攻击防御   记得以前有人说过,对于一家软件公司来说,最重要的不是它的办公楼,也不是它的股票,而是代码.代码这东西,说到底就是一堆数据.这话不假,但是不仅仅这样,对于一家企业来说,它的用户数据也是最重要的几个之一.在座各位想必多为DBA或者数据分析相关岗位的同学,关于数据对企业的重要性,应该理解很深刻了.

开发者论坛一周精粹(第九期):Joomla!3.7.0 Core SQL注入漏洞

第九期(2017年5月15日-2017年5月21日 ) 2017年5月17日,国外研究人员发现开源CMS软件Joomla!3.7.0 Core 版本里面发现一个SQL注入漏洞攻击,该漏洞风险较高,可能存在数据泄露的风险. [漏洞公告]Joomla!3.7.0 Core SQL注入漏洞 作者:正禾 码栈惊喜赋能618大促 释放工作量轻松备战! 作者:码栈小二 终极告白--com域名批量注册39元/首年! 作者:万小域 是时候亮出你的wang牌了!wang注册/续费/转入限时优惠! 作者:万小域 五