欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SQL注入漏洞过程实例及解决方案

程序员文章站 2022-11-19 20:29:48
代码示例:public class jdbcdemo3 { public static void demo3_1(){ boolean flag=login("aaa' or ' ","165...

代码示例:

public class jdbcdemo3 {
  public static void demo3_1(){
    boolean flag=login("aaa' or ' ","1651561");  //若已知用户名,用这种方式便可不用知道密码就可登陆成功
    if (flag){
      system.out.println("登陆成功");
    }else{
      system.out.println("登陆失败");
    }

  }
  public static boolean login(string username,string password){
    connection conn=null;
    statement stat=null;
    resultset rs=null;
    boolean flag=false;
    try {
      conn=jdbcutils.getconnection();
      string sql="select * from user where username='"+username+"'and password='"+password+"'"; //此处是sql注入漏洞的关键,因为是字符串的拼接,会使查询语句变为:select * from user where username='aaa' or '' and password='1651561',此查询语句是可得到结果集的,便出现此漏洞
      stat=conn.createstatement();
      rs=stat.executequery(sql);
      if(rs.next()){
        flag=true;
      }else{
        flag=false;
      }
    } catch (sqlexception e) {
      e.printstacktrace();
    }
    return flag;
  }

解决方法,使用preparestatment:

public static void demo3_1(){
    boolean flag=login1("aaa' or ' ","1651561");
    if (flag){
      system.out.println("登陆成功");
    }else{
      system.out.println("登陆失败");
    }

  }
  public static boolean login1(string username,string password){
    connection conn=null;
    preparedstatement pstat=null;
    resultset rs=null;
    boolean flag=false;

    try {
      conn=jdbcutils.getconnection();
      string sql="select * from user where username=? and password=?"; //使用?代替参数,预先设置好sql格式,就算在输入sql关键字也不会被sql识别
      pstat=conn.preparestatement(sql);
      pstat.setstring(1,username); //设置问号的值
      pstat.setstring(2,password);
      rs=pstat.executequery();
      if(rs.next()){
        flag=true;
      }else{
        flag=false;
      }
    } catch (sqlexception e) {
      e.printstacktrace();
    }
    return flag;
  }
}

使用以上解决办法就无法通过sql注入漏洞登陆用户成功。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。