网上看到很多关于防止登录SQL注入的方法, 搜到的很多大概是都是过滤和字符转换.


而过滤和转换是因为***者的输入中会包含一些关键词,诸如:select, delete,or, ' ,drop等等。


用这两种方式来解决登录注入的原因是,他们的登录的时候,用户名和密码的验证语句大概都是这样的:


select * from adminwhere username='XXX' and password='YYY'的语句,若在正式运行此句之前,如果没有进行必要的字符过滤,则很容易实施SQL注入。

如在用户名文本框内输入:abc’ or1=1-- 在密码框内输入:123 则SQL语句变成:

select * from adminwhere username='abc’ or 1=1 and password='123’不管用户输入任何用户名与密码,此语句永远都能正确执行,用户轻易骗过系统,获取合法身份。


这样子的话, 确实可以通过构造一些特殊的输入,改变sql语句的结构从而导达到想要的结果。


刚刚开始, 自己的验证命令并不是这样的,所以有次朋友说要给我测试下登录的sql注入安全,结果没被***成功,那时候并不懂sql注入的原理,毕竟还是菜鸟。

我的sql验证语句是这样的:

select password from admin where username='XXX'

如果查得到password的话,就用此password和用户输入的password进行比较,相等的话则登录成功,否则显示密码错误。

如果查不到password的话,说明用户不存在,显示提示用户名不存在。


这样一来,即使***者构造了诸如:

xxx' or 1=1  的输入,是语句变成:

select password from admin where username='xxx' or 1=1

虽然语句的where条件还是成立,执行返回的结果是true

但是下一步的比较:从数据库的password和用户输入的password就不能成立了,因为没有查到,所以这就防止了sql注入欺骗。


后来跟另一个朋友讨论了,他也觉得应该要跟我一样的写法,并且他也都是这样做的,所以可能网上的很多大神都是这么干的,只是没有写出来而已,今天本菜鸟就瞎写一下,当作是第一篇博客!