回顾下之前jdbc的开发步骤:
1:建项目,引入数据库驱动包
2:加载驱动
Class.forName(..);
3:获取连接对象
4:创建执行sql语句的stmt对象; 写sql
5:执行sql
a) 更新 delete/insert/update
!:executeUpdate();
b) 查询 select
!:executeQuery();
6:关闭/异常
之前有说过,Statement接口和PreparedStatement接口的区别,其中的一个就是:
PreparedStatement接口能够防止sql注入
那么,什么是sql注入呢?
其实sql注入就是用户输入的恶意密码,能够绕过你的用户名和密码登陆。
例子:
1:首先创建个数据库
1 -- 创建数据库 2 CREATE DATABASE jdbc_demo DEFAULT CHARACTER SET utf8;i 3 -- 创建表 4 USE jdbc_demo; 5 CREATE TABLE admin( 6 id INT PRIMARY KEY AUTO_INCREMENT, 7 userName VARCHAR(20), 8 pwd VARCHAR(20) 9 )
2:使用Statement接口,没有防止sql注入:
1 /** 2 * 模拟用户登陆数据库,演示注入 3 * 4 * @author LLZ 5 */ 6 public class Two_StatementDemo { 7 8 /** 9 * 1:sql注入 Statement 10 */ 11 12 private Connection conn; 13 private Statement stsm; 14 private ResultSet rs; 15 private PreparedStatement pstsm; 16 17 @Test 18 public void Test1() { 19 20 String user = "tom"; 21 // String password = "123"; 22 String password = " ' or 1=1 -- /**/ "; // sql注入,这个也可以登陆成功 23 24 try { 25 // 1.1:加载驱动 26 conn = Jdbcutil.getConnection(); 27 28 // 1.3:创建Statement对象 29 stsm = conn.createStatement(); 30 31 // 1.4:准备sql语句 32 String sql = "select * from jdbc where user='" + user 33 + "' and password='" + password + "' "; 34 35 // 1.5:执行sql 36 rs = stsm.executeQuery(sql); 37 38 // 1.6:打印返回的结果 39 if (rs.next()) { 40 System.out.println(rs.getInt("id")); 41 } 42 } catch (Exception e) { 43 e.printStackTrace(); 44 45 } finally { 46 // 1.7:关闭连接 47 try { 48 rs.close(); 49 stsm.close(); 50 conn.close(); 51 } catch (Exception e) { 52 53 e.printStackTrace(); 54 } 55 } 56 }
3:使用PreparedStatement接口,防止sql注入:
其原因就是由于该接口具有缓存区,需要先执行预编译远,等传入参数才正式执行sql语言
1 /** 2 * 二:用PreparedStatement防止sql注入 3 */ 4 @Test 5 public void Test2() { 6 7 String user = "tom"; 8 String password = "123"; 9 // String password = " ' or 1=1 -- /**/ "; // sql注入,这个在这里就无法登陆 10 // 准备sql预编译语句 11 String sql = "select * from jdbc where user=? and password=?"; 12 13 try { 14 // 2.1:创建连接 15 conn = Jdbcutil.getConnection(); 16 17 // 2.2:创建PerparedStatement对象(执行预编译) 18 pstsm = conn.prepareStatement(sql); 19 20 // 2.3:准备参数 21 pstsm.setString(1, user); 22 pstsm.setString(2, password); 23 24 // 2.4:发送参数,执行sql 25 ResultSet rs = pstsm.executeQuery(); 26 if (rs.next()) { 27 System.out.println(rs.getInt("id")); 28 } 29 } catch (Exception e) { 30 e.printStackTrace(); 31 } finally { 32 // 2.5:关闭连接 33 Jdbcutil.close(conn, pstsm, rs); 34 } 35 36 }