您的位置:首页 > 其它

学生信息管理系统之万能用户'or''='

2014-07-21 16:48 260 查看
      以前听说过SQL注入问题,但是我不懂,偶尔有一次看师哥师姐他们的博客,发现了这个问题,于是在网上查了查,以我现在知识水品来理解,我只能说这是利用数据库的一些漏洞来入侵程序。

       这个事情在学生信心管理系统管理系统就出现了,在登录窗口的用户名里输入'or''=' ,然后在密码文本框里输入你数据库中user表中的第一行的密码,按下enter键系统就自动登录了,这是怎么回事哪?还有问什么是据库中user表中的第一行的密码哪?别的密码不行吗?下面我介绍一下我对这个问题的简单看法。

         首先看图




 我数据库中没有这个用户'or''='   第一个用户是student



 


  
按下enter键输入完毕后,按下enter键就进入系统了。




 
     这是怎么回事哪,自己查查资料,'or''=' 这个是从你指定的表中查询所有数据的代码,也就是把你所有的用户都给调出来了,所以这是一个万能用户。但是为什么只能输入第一行代码才能进入系统那?原因很简单,这是模块中我们定义的函数所导致的。现在我们来看看我们模块中定义查询数据库的函数吧。
Public Function ExecuteSQL(ByVal SQL As String, MsgString As String) As ADODB.Recordset
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim sTokens() As String

On Error GoTo ExecuteSQL_Error

sTokens = Split(SQL) '(Split)拆分函数,拆分字符串形参变量的SQL语句,就是我们在调用函数时传过来的语句
Set cnn = New ADODB.Connection
cnn.Open ConnectString

If InStr("INSERT,DELETE,UPDATE", UCase$(sTokens(0))) Then'Instr函数返回要截取的字符串在源字符串中的位置

cnn.Execute SQL '这样连接数据库不需要返回数据,open方法打开数据库时能返回数据

MsgString = sTokens(0) & "query successful"
'虽然MsgString不是返回值,但传递的方式是byref实参这个地址和这个地址是一样的
Else
Set rst = New ADODB.Recordset
'得到临时表,游标指向第一条记录
rst.Open Trim$(SQL), cnn, adOpenKeyset, adLockOptimistic'adOpenKeyset(键集游标),adOpenKeyset(仅当调用update方法时,数据提供者锁定记录)

Set ExecuteSQL = rst
MsgString = "查询到" & rst.RecordCount & "条记录"
End If

ExecuteSQL_Exit:
Set rst = Nothing
Set cnn = Nothing
Exit Function
ExecuteSQL_Error:
MsgString = "查询错误:" & Err.Description
Resume ExecuteSQL_Exit
End Function

 
     好了,大家看完代码了吧,那为什么我们只能输入临时表user中的第一行密码那?是因为我们得到临时表游标默认直接指向第一条记录,所以我们只能输入user表中第一行密码,也就是现在我数据库user表中studen。大家可以试试如果我们在frmLogin窗体的代码做一下手脚,第二行密码也能进去,怎么做手脚那,看下面frmLogin窗体中的确定按钮代码




 
     当我们执行 ExecuteSQL函数返回临时默认指向第一条记录吗,我们给它添加一个movenext代码,游标就指向第二条了。

这个问题的解决,我们可以限制输入用户名这文本框的maxLength属性,让它的值为六,小于字符串'or''='的个数,'or''=' 这行代码就不会输入进去了,我觉得这样可以。还可以限制特殊字符,编辑文本框的Keypress事件,代码如下。

<span style="font-size:18px;">Private Sub txtUser_KeyPress(KeyAscii As Integer)
Dim cTemp As string
cTemp = " '" '禁止输入的字符
if Instr(1,cTemp,chr(KeyAscii)) <> 0 then
keyascii = 0 'keyascii=0 代表撤销键盘事件
End if
End Sub</span>


这样,英文状态下的单引号就输入不进去了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: