SQL注入攻击,虽然使用数据库已经有接两年了,也做过一个实际的项目,但是都没有注意到这个问题,可悲啊,现在回想起来上次做的系统,会不会也有这一类的完全隐患,不敢想啊,不过还没有交去改代码,就可能还没有大的问题,好了就说到这,今天在看web安全问题时,发现了SQL注入攻击,并且看到了一个关于SQL注入攻击的一个经典的例子,下面我们就演示一下吧,加强一下我的记忆,我也是刚接触SQL注入攻击,还希望熟悉SQL注入攻击人士给我指点指点。
我们看一下这样一段代码(jsp页面)
Statement stmt=conn.createStatement();
String strCmd="select username from users where username="+" ' "+name+" 'and password=' "+pwd+" ' ";
ResultSet rs=stmt.executeQuery(strCmd);
if(rs.next()){
session.setAttribute("user" ,name);
response.sendRedirect("admin.jsp");
return;
}else{
response.sendRedirect("login.jsp");
return;
}
这段代码就是判断登陆的用户是否为管理员,如果是,就显示管理员页面,否则就让用户重新登陆。
如果用户输入用户名zhangsan,密码1234
那么构造的SQL语句就是如下所示:
select username from users where username='zhangsan' and password='1234'
如果恶意的用户通过查看我们的网页源代码,知道了表单中输入的用户名的文本域和口领域的名字,直接在浏览器中地址栏中输入的地址如下
http://www.xxx.com:80/login.jsp?name=abc&password=111'or'1'=1 这样就可以上顺利的访问管理员页面,为什么随便输入一个用户名和密码就能直接访问管理员页面呢?我们通过构造出来的SQL语句明白了,构造出来的SQL语句如下:
select username from users where username='abc' and password='111'or'1'=1
这样我们就明白了为什么随便输入一个用户名和密码就能直接访问管理员页面吧,上面查询语句中最后一部分“or'1'=1”是个恒等式,这样就会将我们users表中的数据全部查询出来。我们可以使用存储过程来解决这个问题,关于怎样具体的去解决,这里就不说了。
这算是对SQL注入攻击的一个初识吧。