在一般的多用户应用系统中只有拥有正确的用户名和密码的用户才能进入该系统我们通常需要编写用户登录窗口来控制用户使用该系统这里以Visual Basic+ADO为例
一漏洞的产生
用于登录的表
Users(namepwd)
建立一个窗体Frmlogin其上有两个文本框TextText和两个命令按钮cmdokcmdexit两个文本框分别用于让用户输入用户名和密码两个命令按钮用于登录和退出
定义Ado Connection对象和ADO RecordSet对象
Option Explicit
Dim Adocon As ADODBConnection
Dim Adors As ADODBRecordset
在Form_Load中进行数据库连接
Set Adocon = New ADODBConnection
AdoconCursorLocation = adUseClient
adoconOpen Provider=MicrosoftjetOLeDB;Data Source= && _
AppPath && estmdb;
cmdok中的代码
Dim sqlstr As String
sqlstr = select * from usersswheresname= && TextText && _
and pwd= && TextText &&
Set adors = New ADODBRecordset
Set Adors=AdoconExecute(sqlstr)
If AdorsRecordcount> Then //或If Not AdorsEOF then
MsgBox Pass //通过验证
Else
MsgBox Fail //未通过验证
End if
运行该程序看起来这样做没有什么问题但是当在Text中输入任意字符串(如)在Text中输入a or a=a时我们来看sqlstr此时的值
select * from usersswheresname= and pwd=a or a=a
执行这样一个SQL语句由于or之后的a=a为真值只要users表中有记录则它的返回的eof值一定为False这样就轻易地绕过了系统对于用户和密码的验证
这样的问题将会出现在所有使用select * from usersswheresname= && name && and pwd= && password &&的各种系统中无论你是使用那种编程语言
二漏洞的特点
在网络上以上问题尤其明显笔者在许多网站中都发现能使用这种方式进入需要进行用户名和密码验证的系统这样的一个SQL漏洞具有如下的特点
与编程语言或技术无关
无论是使用VBDelphi还是ASPJSP
隐蔽性
现有的系统中有相当一部分存在着这个漏洞而且不易觉察
危害性
不需要进行用户名或密码的猜测即可轻易进入系统
三解决漏洞的方法
控制密码中不能出现空格
对密码采用加密方式
这里要提及一点加密不能采用过于简单的算法因为过于简单的算法会让人能够构造出形如a or a=a的密文从而进入系统
将用户验证和密码验证分开来做先进行用户验证如果用户存在再进行密码验证这样一来也能解决问题