SQL注入就是攻击者通过正常的WEB页面,把自己SQL代码传入到应用程序中,从而通过执行非程序员预期的SQL代码,达到窃取数据或破坏的目的。当应用程序使用输入内容来构造动态SQL语句以访问数据库时,会发生SQL注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生SQL注入。SQL注入可能导致攻击者使用应用程序登陆在数据库中执行命令。如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。在某些表单中,用户输入的内容直接用来构造:http://www.xxx.com/showdetail.aspx?id=49anduser>0这句语句很简单,但却包含了SQLServer特有注入方法的精髓,。首先看看它的含义:首先,前面的语句是正常的,重点在anduser>0,我们知道,user是SQLServer的一个内置变量,它的值是当前连接的用户名,类型为nvarchar。拿一个nvarchar的值跟int的数0比较,系统会先试图将nvarchar的值转成int型,当然,转的过程中肯定会出错,SQLServer的出错提示是:将nvarchar值”abc”转换数据类型为int的列时发生语法错误,呵呵,abc正是变量user的值,这样,注入着就拿到了数据库的用户名。众所周知,SQLServer的用户sa是个等同Adminstrators权限的角色,拿到了sa权限,几乎肯定可以拿到主机的Administrator了。上面的方法可以很方便的测试出是否是用sa登录,要注意的是:如果是sa登录,提示是将”dbo”转换成int的列发生错误,而不是”sa”。当然注入者还可以输入不同的信息来得到他们想要的信息,上面只是其中一个例子,所以我们要限制错误信息的输出,从而保护我们的数据库数据,这里我给出.NET限制错误信息的方法:在Web.Config文件中设置这样当发生错误时候就不会讲信息泄露给外人。2.限制访问数据库帐号的权限对于数据库的任何操作都是以某种特定身份和相应权限来完成的,SQL语句执行前,在数据库服务器端都有一个用户权限验证的过程,只有具备相应权限的帐号才可能执行相应权限内的SQL语句。因此,限制数据库帐号权限,实际上就阻断了某些SQL语句执行的可能。不过,这种方法并不能根本解决SQL注入问题,因为连接数据库的帐号几乎总是比其他单个用户帐号拥有更多的权限。通过限制贴帐号权限,可以防止删除表的攻击,但不能阻止攻击者偷看别人的信息。3.参数化使用命令参数化命令是在SQL文本中使用占位符的命令。占位符表示需要动态替换的数据,它们通过Command对象Parameters集合来传送。能导致攻击的SQL代码可以写成:Select*fromemployeewhereuserID=@userID;如果用户输入:09105022’OR‘1’=’1,将得不到何记录,因为没有一个用户ID与文本框中输入的’09105022’OR‘1’=’1’相等。参数化命令的语法随提供程序的不同略有差异。对于SQLSERVER提供程序,参数化命令使用命名的占位符具有唯一的名字,而对于OLEDB提供程序,每个硬编码的值被问号代替。使用OLEDB提供程序时,需要保证参数的顺序和它们出现在SQL字符串中的位置一致。SQLSERVER提供程序没有这样的需求,因为它们用名字和占位符匹配。4.调用存储过程存储过程是存储在数据库服务器上的一系列SQL代码,存储过程与函数相似,有良好的逻辑封装结构,可以接收和返回数据。使用存储过程可以使代码更易于维护,因为对存储过程的更改不会导致应用程序的重新编译,使用存储过程还可以节省带宽,提高应用程序性能。因为存储过程是存储在数据库服务端的独立的封装体,调用存储过程可以保证应用程序只执行存储过程中的固定代码,从而杜绝SQL语句注入的可能。结合上述所讲的参数化命令,可以实现SQL代码可以实现的任何功能,并进一步提高应用程序的安全等级。5.限制输入长度如果在Web页面上使用文本框收集用户输入的数据,使用文本框的MaxLength属性来限制用户输入过长的字符也是一个很好的方法,因为用户的输入不够长,也就减少了贴入大量脚本的可能性。程序员可以针对需要收集的数据类型作出一个相应的限制策略。6.URL重写技术我们利用URL重写技术过滤一些SQL注入字符,从而达到防御SQL注入。因为许多SQL注入是从URL输入发生的。7.传递参数尽量不是字符假设我们显示一篇新闻的页面,从URL传递参数中获得newid我们可能会随手写下下面的代码:stringnewsid=Request.QueryString.SendTo;//重写URLRewriterUtils.RewriteUrlapp.Context,sendToUrl;break;//退出For循环}}}}那么下一步就是检验例子了首先我们输入http://localhost:4563/web/Default.aspx?id=1;--这样http://localhost:4563/web/Default.aspx?id=1;--没有改变,就会显示Default_sql_error.aspx里内容“您输入了危险字符”。再输入http://localhost:4563/web/D11.aspx就会显示Default2.aspx内容,因为这里触发了第二个重写规则。
连丽阳2019-12-21 15:38:05