SQL注入漏洞是网站安全防护中最常见的漏洞之一,也是黑客最喜欢的攻击途径,因为发起SQL注入攻击非常简单,使用注入攻击工具就可以轻松实施入侵,但防范SQL注入攻击却非常困难。我们以后台登录功能为例,在数据库查询时,一般使用如下SQL代码:select * from [users] where username='用户名' and password='密码'
如果用户名填写admin,密码填写:123456,完整的SQL语句就是:select * from [users] where username='admin' and password='123456'
如果有返回结果,表示账户和密码是正确的。看起来是没问题,但如果简单改一下,把密码改为:123' or 'a'='a'select * from [users] where username='admin' and password='123' or 'a'='a'
很显然a=a是成立的,数据库就会返回记录,黑客也就成功进入系统了。严格讲,没有彻底防护一说,因为漏洞无止境,唯有尽可能的提升防护能力。这种方法是防护SQL注入最常用的方法,是最有效的方法,但也是最让人无赖的方法,因为出现SQL注入漏洞的原因就是此种方法过滤不全面引发的。例如上文的username和password,如果我们将password参数的单引号、双引号、空格替换为空,完整的SQL语句变为:select * from [users] where username='admin' and password='123ora=a'
我们除了对password参数过滤,还需要对username参数进行过滤,即:在SQL查询语句中的所有参数,都需要进行过滤。建议过滤掉的字符:' " ( ) * [ ] > < % 空格 Tab键防护原理:建立一个公共页面,让每个脚本文件都include这个页面。在这个公共页面中,对输入服务器的参数进行危险SQL关键词检测,发现有危险关键词,就阻止访问。示例代码如下:<%
' 函数:检查参数中是否包含危险SQL语句
Function ChkSQL(inputString)
if instr(inputString,"select")>0 then ChkSQL=1
if instr(inputString,"update")>0 then ChkSQL=1
'其他需要过滤的危险SQL语句
'...
'...
End Function
' 检查GET参数
Dim queryStringKey, queryStringValue
For Each queryStringKey In Request.QueryString
queryStringValue = Request.QueryString(queryStringKey)
If ChkSQL(queryStringValue)=1 Then
Response.Write "非常抱歉,你的请求涉嫌危险操作,已阻止访问!<br>"
Response.End
End If
Next
' 检查POST参数
Dim formKey, formValue
For Each formKey In Request.Form
formValue = Request.Form(formKey)
If ChkSQL(formValue) Then
Response.Write "非常抱歉,你的请求涉嫌危险操作,已阻止访问!<br>"
Response.End
End If
Next
%>
防护原理和方法二想同,都是对输入数据进行过滤,不同点在于此方法无需更改代码,非常适合不会玩代码的人使用,同时副作用要远小于方法二。不过必须使用相关的防注入软件,推荐使用《护卫神.防入侵系统》,自带SQL注入防护和XSS跨站攻击防护(如下图一)。只需要安装上软件,都不用任何设置,系统就自动防护SQL注入,拦截效果如下图二。上述三种方法,分别在不同层面,用不同方法对SQL注入攻击进行防护,推荐使用“方法一+方法三”组合防护,让网站坚不可摧!
还没有评论,来说两句吧...