(一)问题引入
其实上一篇博客写的登录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注入,并且效率更高;