其实这不是什么高深的技术,遭受这种攻击往往是由于程序员编程时的疏漏.
现在的培训班在培训学生的时候还是教授他们拼sql字符串的模式进行用户登录验证,却没有告知这样的害处.
这里举一个拼sql字符串进行用户登录验证的例子
String sql = "SELECT * FROM t_User WHERE username='"+username+"' AND psw='"+psw+"'";
.......
rs = stmt.executeQuery(sql);
if(rs.next()).......;
上面是初学者很常用的一种验证模式.仅从表面来看看不出什么问题
从form获得username和psw然后拼成字符串sql然后执行该语句,如果结果集不为空表示用户名密码正确.否则不正确.
看起来这个有什么问题吗?如果你觉得没有,那你也犯上了同样的错误.
如果我们在密码文本域中输入下面的字符串你想想看会是怎样的效果:
asd' OR 'a'='a
不难想见,由于or运算的巧妙参与,这个sql语句变得与"SELECT * FROM t_User"没有任何区别.
那么我们的if(rs.next());还有任何意义吗?肯定可以通过的.
所以我们在进行编程的时候,要绝对杜绝这种事情的发生.有人提出一个建议,检索用户名相关的密码.然后在程序中比较,那当我们知道一个用户名的时候,也可以搞定它.
最好的办法是过滤单引号,或者使用PreparedStatement,把问题交给数据库去搞定.再就是使用持久化层架构,一切就不用我们操心了.