在验证用户名和密码时使用的方法是,先用用户名(uid)得到一个User类型的对象user,再用equals方法匹配user的password属性和表单提交的password数据是否相等。为什么要这样做呢?为什么不直接将表单提交的数据uid和password传递到DAO类,然后编写如下的查询语句,如果有结果返回则表明登录成功?
SELECT * FROM user WHERE uid=” + ‘uid’ +” and password=” ‘+ password +’ ” |
这是许多初学者和经验不足的程序员会写出的语句,表面上看起来这样的语句没有任何问题,可是当遇到有意图的破坏者,这将会产生严重的后果。试想,如果用户在登录表单的密码输入框中输入的内容为“ ‘or’ ‘1’=‘1’”,而不管在用户名输入框中输入什么内容,以上的SQL语句组合完毕过后将有如下的形式:
SELECT * FROM user WHERE uid=’asdf’ and password=’ ’ or ‘1’ = ‘1’ |
显然,无论用户名输入什么,这条语句总能将user表中的所有内容查出来,也就是说,破坏者只需要输入一些特殊的字符就可以轻易地登录到系统,这无疑是一个极大的漏洞,潜在的损失也就是不可估量的。
因此,在验证用户名和密码时使用的方法是,先用用户名(uid)得到一个User类型的对象user,再用equals方法匹配user的password属性和表单提交的password数据是否相等。