您的位置:首页 > 数据库

sql注入漏洞的一种实例

2013-10-27 22:50 281 查看
  在做毕业设计的时候,竟然碰到了一中叫sql注入漏洞的现象。

  当笔者用一条sql语句查询时,select * from users where username='zf' and passwd='zf' or 1='1'   竟然将所有的数据全都查了出来。

  检查用户合法性的代码如下:

//检查用户的合法性
public boolean checkUser(String u,String p){
boolean b=false;
try {
ConnDB db=new ConnDB();
conn=db.getConn();
String sql="select top 1 * from users where username='"+u+"' and passwd='"+p+"'";
ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
b=true;
}
}catch (Exception e) {
e.printStackTrace();
}finally{
this.close();

}
return b;
}


  这时候在登录界面随便输入一个用户名,然后密码输入select * from users where username='zf' and passwd='zf' or 1='1' 中红色的部分即可(zf可以是任意字符,为空也可),就可以顺利的登入网站。是无论用什么用户名都可以。

  解决的办法就是通用输入的用户名去查询数据库,然后返回一个密码,用这个密码与用户输入的密码进行比较,这样就可以解决如上的sql注入漏洞的问题。

  String sql="select top 1  passwd  from users where username='"+u+"' ";

  ps = conn.prepareStatement(sql);

  ResultSet rs = ps.executeQuery();
if (rs.next()) {

String passwd=rs.getString(3);
if(passwd.equals(p)){
b=true;

}


  还有一种办法就是用ps.setXXX()的方式。

  

//检查用户的合法性
public boolean checkUser(String u,String p){
boolean b=false;
try {
ConnDB db=new ConnDB();
conn=db.getConn();
String sql="select top 1 * from users where username=? and passwd=?";
ps = conn.prepareStatement(sql);
ps.setString(1, u);
ps.setString(2, p);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
b=true;
}
}catch (Exception e) {
e.printStackTrace();
}finally{
this.close();

}
return b;
}


  这两种方式都可以解决这种sql注入漏洞的。当然第一种方法是通用的,而第二种只能针对jsp语言的。

  如有不足之处欢迎提出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sql注入漏洞