在Web应用程序的登录验证程序中,一般有用户名(username) 和密码(password)两个参数,程序会通过用户所提交输入的用户名和密码来执行授权操作。我们有很多人喜欢将SQL语句拼接起来。例如:
Select * from userswhere username =’ txtusername.Text ’ and password =’ txtpassword.Text ’
其原理是通过查找users表中的用户名(username) 和密码(password) 的结果来进行授权访问,在txtusername.Text为a,txtpassword.Text为1,那么SQL查询语句就为:
Select * from userswhere username =’ a ’ and password =’ 1 ’
如果分别给txtusername.Text 和txtpassword.Text赋值’ or ‘1’ =‘1’ --和abc。那么,SQL 脚本解释器中的上述语句就会变为:
Select * from userswhere username =’’or ‘1’ = ‘1’ -- and password =’abc’
该语句中进行了两个条件判断,只要一个条件成立,就会执行成功。而'1'='1'在逻辑判断上是恒成立的,后面的"--"表示注释,即后面所有的语句为注释语句这样我们就成功登录。即SQL注入成功.
类似的原理还有
' or1=1--
1'or'1'='1
x'or'1'='1'or'1'='1
如果我们给txtusername.Text赋值为:’;droptable users--即:
Select * from userswhere username =’’;drop table users-- and password =’abc’
整个用户表就没有了,当然这里要猜出数据表名称。想想是多么可怕的事情。
防范SQL注入
最简单的方法是对用户的输入进行判定和过滤
可以禁止输入非法字符
Private SubtxtUserName_Change()
Dim s As String, ss As Long, i As Long
s = "\=<>*'- /'" '需要禁止的字符
ss = txtUserName.SelStart
For i = 1 To Len(s)
i = Len(txtUserName.Text)
txtUserName.Text =Replace(txtUserName.Text, Mid(s, i, 1), "")
If i <> Len(txtUserName.Text) And ss > 0 Then ss = ss - 1
Next
txtUserName.SelStart = ss
End Sub