前天师傅在查看作品的时候,给提到了SQL注入的问题,只见师傅在登录窗体的用户名文本框中输入:' or 1=1 -- 就这么一段看似乱七八糟的东西,然后竟登上了系统(数据库中没有这个用户),师傅也不给讲,没办法,自己整呗。
后来了解到,所谓SQL注入:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。对此也不是很明白,但从师傅给的上面例子来看,我理解的是:用英文单引号从新构造SQL语句,让系统执行你所重构的没有安全限制的SQL语句。其中的' 是英文单引号; or后面的内容不一定是1=1 只要一个条件为真的语句就行;-- 是将SQL语句后面的条件部分给注释了。
想了半天,关键点还是在' 英文单引号上面,因为这个是重构SQL语句的关键,师傅给提到说过用参数传递,网上也查到了说用存储过程,但是作为一个在成长中的菜鸟,都不是很理解其他的办法。跟目前自己所学习的联系起来,苦苦折腾了一上午,有了点头绪:既然英文单引号是关键,那么可不可以禁止输入英文单引号呢?这样可以跟以前学习的assic码联系起来;但是问题又出来了,自己不知道英文单引号的ASSIC码是多少!从网上查,后来查到在临时窗口中输入:debug.print "Ascii of "" “ "" is:";asc(" “ ") 可以返回所想要的ASSIC码,折腾了一会,查出来了英文单引号的ASSIC码是39 ,于是,在用户登录窗口试了一下:
Private Sub txtUserName_KeyPress(KeyAscii As Integer)
If KeyAscii = 39 Then
MsgBox"为了防止SQL语句注入,禁止输入英文单引号!"
txtUserName.text=""
txtUserNama.setfocus
End If
End Sub
测试结果:当输入英文单引号的时候,提示对话框弹出。
不足之处:
1提示对话框弹出之后,下面的照常执行,但是文本框内容还是有所输入的英文单引号,不知为何清楚不了
2防止输入英文单引号,但是还是没有办法防止,因为可以复制粘贴粘到文本框上再进行SQL注入
3要求用户手动清空英文单引号再进行输入
4把英文单引号复制到密码框的时候,容易造成系统崩溃~~~~~~~
黔驴技穷,没办法了,以目前的能力就只能给出这么一个不完美的解决方法和思路,等待着自己的进步!