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

      以前听说过SQL注入问题,但是我不懂,偶尔有一次看师哥师姐他们的博客,发现了这个问题,于是在网上查了查,以我现在知识水品来理解,我只能说这是利用数据库的一些漏洞来入侵程序。
       这个事情在学生信心管理系统管理系统就出现了,在登录窗口的用户名里输入'or''=' ,然后在密码文本框里输入你数据库中user表中的第一行的密码,按下enter键系统就自动登录了,这是怎么回事哪?还有问什么是据库中user表中的第一行的密码哪?别的密码不行吗?下面我介绍一下我对这个问题的简单看法。

         首先看图

学生信息管理系统之万能用户'or''='_第1张图片
 我数据库中没有这个用户'or''='   第一个用户是student


 学生信息管理系统之万能用户'or''='_第2张图片
  
按下enter键输入完毕后,按下enter键就进入系统了。
学生信息管理系统之万能用户'or''='_第3张图片
 
     这是怎么回事哪,自己查查资料,'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窗体中的确定按钮代码
学生信息管理系统之万能用户'or''='_第4张图片
 
     当我们执行 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>


这样,英文状态下的单引号就输入不进去了。

你可能感兴趣的:(学生信息管理系统之万能用户'or''=')