(一)问题引入

其实上一篇博客写的登录Demo是有BUG

 

我们输入一个不存在的用户名加一个特殊的密码,就可以登录成功了

(二)SQL注入问题

1、 输入用户随便,输入密码a'or'a'='a就可以登录成功;
2、 sql:select*fromuserwhereusername='zzq'andpassword='a'or'a'='a'
我们在MySQL执行这条语句试试:

 

可以看到在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题

(三)解决sql注入问题

使用PreparedStatement对象解决
预编译的SQL:参数使用?作为占位符

步骤

1、 前面的步骤都一样;
2、 定义sql:;
select * from user where username = ? and password = ?; 3、 获取执行sql语句的对象PreparedStatement
Connection.prepareStatement(String sql) 4、?赋值;
方法:setxxx(参数1,参数2)

其中参数1是指?的位置编号,从1开始;参数2是?的值

5、 执行sql,接收返回的结果,不需要传递sql语句;
6、 后面的步骤也跟之前一样;

(四)Coding

我们对之前的登录案例的Demo Debug

1、 修改定义的sql

//2.定义sql
String sql = "select * from user where username = ? and password = ?";

1、 修改sql的执行对象
 

//3.获取执行sql的对象
pstmt = conn.prepareStatement(sql);

1、 给?赋值

//给?赋值
pstmt.setString(1, username);
pstmt.setString(2, password);

1、 修改执行sql

//4.执行查询
rs = pstmt.executeQuery();

1、 释放资源
  2、 问题解决
 

注意

1、 后期都会使用prepareStatement来完成所以的增删改查操作;
2、 因为它可以防止SQL注入,并且效率更高;