您的位置:首页 > 数据库

关于登录验证的SQL避免浅见

2013-06-26 11:57 211 查看
网上看到很多关于防止登录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注入欺骗。
后来跟另一个朋友讨论了,他也觉得应该要跟我一样的写法,并且他也都是这样做的,所以可能网上的很多大神都是这么干的,只是没有写出来而已,今天本菜鸟就瞎写一下,当作是第一篇博客!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: