SQL注入案例

注入案例:

public class SQL01 {
  public static void main(String[] args) throws Exception {
   Scanner sc=new Scanner(System.in);
   System.out.println("请输入用户名");
   String id=sc.nextLine();
   System.out.println("请输入密码");
   String password=sc.nextLine();
   
   Class.forName("com.mysql.jdbc.Driver");
   String url="jdbc:mysql:///mydb1";
   
   Connection con=DriverManager.getConnection(url, "root", "1234");
   /*Statement st=con.createStatement();
   String sql="select * from sinfor where id='"+id+"' and password='"+password+"'";*/
   String sql="select * from sinfor where id= ? and password= ?";
   PreparedStatement st=con.prepareStatement(sql);
   st.setString(1, id);
   st.setString(2, password);
   System.out.println(sql);
   ResultSet rs=st.executeQuery();
   if(rs.next()){
    System.out.println("登录成功!");
    rs.close();
   }else{
    System.out.println("登录失败!");
   }
   st.close();
   con.close();
  }
 }

输出结果:

            请输入用户名

1' or '1'='1

请输入密码

1' or '1'='1

select * from sinfor where id='1' or '1'='1' and password='1' or '1'='1'

              登录成功!

 

 

解决方案:

使用preparedStatement方法 

 public class SQL01 {
 public static void main(String[] args) throws Exception {
  Scanner sc=new Scanner(System.in);
  System.out.println("请输入用户名");
  String id=sc.nextLine();
  System.out.println("请输入密码");
  String password=sc.nextLine();
  
  Class.forName("com.mysql.jdbc.Driver");
  String url="jdbc:mysql:///mydb1";
  
  Connection con=DriverManager.getConnection(url, "root", "1234");
  /*Statement st=con.createStatement();
  String sql="select * from sinfor where id='"+id+"' and password='"+password+"'";*/
  String sql="select * from sinfor where id= ? and password= ?";
  PreparedStatement st=con.prepareStatement(sql);
  st.setString(1, id);
  st.setString(2, password);
  System.out.println(sql);
  ResultSet rs=st.executeQuery();
  if(rs.next()){
   System.out.println("登录成功!");
   rs.close();
  }else{
   System.out.println("登录失败!");
  }
  st.close();
  con.close();
 }
}

输出结果:

              请输入用户名

1' or '1'='1

请输入密码

1' or '1'='1

select * from sinfor where id= ? and password= ?

              登录失败!

 

 

两次比较结果:

(1)在statement方法中,参数值会被直接添加到sql字符串中,极有可能被更换结构

(2)在preparedStatement方法中,参数只是参数,不会影响sql语句的本质

 

你可能感兴趣的:(SQL注入案例)