public class Login { public boolean login(String card,String password){ boolean rtn= false; try { //1、加载驱动:加载数据库提供的驱动类 Class.forName("oracle.jdbc.driver.OracleDriver"); //2、获取数据库连接,通过java的驱动管理器 Connection conn = DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:orcl ", "test01", "131281huazioo"); //3、获得操作数据库的声明 Statement st=conn.createStatement(); //sql语句 String sql= "select * from bankcard where card='"+card+"'and password='"+password+"'"; //执行sql语句 ResultSet rs=st.executeQuery(sql); rtn=rs.next(); rs.close(); st.close(); conn.close(); }catch(Exception e){ e.printStackTrace(); } return rtn; } }
以上代码会出现SQL注入
如:
public class Testlogin { @Test public void test() { Login a=new Login();
if(a.login("123123123' or 1='1", "12312312313' or 1='1")){ //无论输入什么数据只要加or 1=1就可以成功
System.out.println("成功!");
}
}
}
or 1=1 加到where条件后保证了条件永远为真,相当于没加条件。
原SQL语句改为:select * from bankcard where card='123132' or 1=1;
1 public void test() { 2 Login a=new Login(); 3 if(a.login("108'--", "12312312313")){ 4 System.out.println("成功!"); 5 } 6 }
加入--将后面的条件注释掉,在Oracle中--表示注释,这样就可以使账号满足的条件下,使密码失效。