SQL注入的原理和防范

SQL注入就是攻击者通过正常的WEB页面,把自己SQL代码传入到应用程序中,从而通过执行非程序员预期的SQL代码,达到窃取数据或破坏的目的。

  当应用程序使用输入内容来构造动态SQL语句以访问数据库时,会发生SQL注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生SQL注入。SQL注入可能导致攻击者使用应用程序登陆在数据库中执行命令。如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或者作为存储过程的输入参数,这些表单特别容易受到SQL注入的攻击。而许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序存在安全隐患。这样,用户就可以提交一段数据库查询的代码,根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是SQL注入就发生了。


防范SQL注入

1.限制错误信息的输出

  这个方法不能阻止SQL注入,但是会加大SQL注入的难度,不会让注入者轻易得到一些信息,让他们任意破坏数据库。SQL Server有一些系统变量,如果我们没有限制错误信息的输出,那么注入着可以直接从出错信息获取,例如(假定这里用的string即字符类型并可以发生SQL注入):http://www.xxx.com/showdetail.aspx?id=49 and user>0 这句语句很简单,但却包含了SQL Server特有注入方法的精髓,。首先看看它的含义:首先,前面的语句是正常的,重点在and user>0,我们知道,user是SQL Server的一个内置变量,它的值是当前连接的用户名,类型为nvarchar。拿一个nvarchar的值跟int的数0比较,系统会先试图将nvarchar的值转成int型,当然,转的过程中肯定会出错,SQL Server的出错提示是:将nvarchar值 ”abc” 转换数据类型为 int 的列时发生语法错误,呵呵,abc正是变量user的值,这样,注入着就拿到了数据库的用户名。


2.限制访问数据库帐号的权限

  对于数据库的任何操作都是以某种特定身份和相应权限来完成的,SQL语句执行前,在数据库服务器端都有一个用户权限验证的过程,只有具备相应权限的帐号才可能执行相应权限内的SQL语句。因此,限制数据库帐号权限,实际上就阻断了某些SQL语句执行的可能。不过,这种方法并不能根本解决SQL注入问题,因为连接数据库的帐号几乎总是比其他单个用户帐号拥有更多的权限。通过限制贴帐号权限,可以防止删除表的攻击,但不能阻止攻击者偷看别人的信息。

3.参数化使用命令

  参数化命令是在SQL文本中使用占位符的命令。占位符表示需要动态替换的数据,它们通过Command对象Parameters集合来传送。能导致攻击的SQL代码可以写成:

Select * from employee where userID=@userID;

  如果用户输入: 09105022’OR ‘1’=’1,将得不到何记录,因为没有一个用户ID与文本框中输入的’ 09105022’OR ‘1’=’1’相等。参数化命令的语法随提供程序的不同略有差异。对于SQL SERVER提供程序,参数化命令使用命名的占位符(具有唯一的名字),而对于OLE DB提供程序,每个硬编码的值被问号代替。使用OLE DB提供程序时,需要保证参数的顺序和它们出现在SQL字符串中的位置一致。SQL SERVER提供程序没有这样的需求,因为它们用名字和占位符匹配。

4.调用存储过程

  存储过程是存储在数据库服务器上的一系列SQL代码,存储过程与函数相似,有良好的逻辑封装结构,可以接收和返回数据。使用存储过程可以使代码更易于维护,因为对存储过程的更改不会导致应用程序的重新编译,使用存储过程还可以节省带宽,提高应用程序性能。因为存储过程是存储在数据库服务端的独立的封装体,调用存储过程可以保证应用程序只执行存储过程中的固定代码,从而杜绝SQL语句注入的可能。结合上述所讲的参数化命令,可以实现SQL代码可以实现的任何功能,并进一步提高应用程序的安全等级。

5.限制输入长度

  如果在Web页面上使用文本框收集用户输入的数据,使用文本框的MaxLength属性来限制用户输入过长的字符也是一个很好的方法,因为用户的输入不够长,也就减少了贴入大量脚本的可能性。程序员可以针对需要收集的数据类型作出一个相应的限制策略。

6.URL重写技术

   我们利用URL重写技术过滤一些SQL注入字符,从而达到防御SQL注入。因为许多SQL注入是从URL输入发生的。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL注入原理是攻击者在用户提交数据时,将恶意的SQL语句注入到应用程序中,从而导致应用程序对数据库的非法操作。攻击者可以通过SQL注入攻击获取数据库中的敏感信息、修改、删除或添加数据等。 防范SQL注入攻击的原理包括以下几点: 1. 数据过滤:在客户端或服务端对输入数据进行过滤,过滤掉特殊字符和SQL关键字,避免攻击者通过输入恶意数据来注入SQL语句。 2. 预编译语句:使用预编译语句可以防止SQL注入攻击。预编译语句是在执行SQL语句之前将SQL语句和参数分离,对参数进行验证和过滤,然后将参数传递给SQL语句执行,从而避免SQL注入攻击。 3. 参数化查询:使用参数化查询可以有效地防止SQL注入攻击。参数化查询是将SQL语句和参数分离,将参数作为占位符传递给SQL语句,然后将参数绑定到占位符上执行SQL语句。 4. 最小化权限:限制数据库用户的权限可以减少SQL注入攻击的影响。将数据库用户的权限最小化,只赋予其必要的权限,可以限制攻击者对数据库的访问。 5. 安全编码:编写安全的代码可以有效地防止SQL注入攻击。编写安全的代码包括正确的输入验证、错误处理、日志记录等。 总之,防范SQL注入攻击的原理是通过数据过滤、预编译语句、参数化查询、最小化权限和安全编码等方式,避免攻击者将恶意的SQL语句注入到应用程序中,从而保护数据库的安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值