作者:日蕾文散Lotus | 来源:互联网 | 2023-05-29 05:36
什么是SQL注入
用户往传值的地方传递进来了SQL语句导致原有SQL语句的逻辑发生改变,从而达到一些非法目的,这个过程叫做SQL注入。
select count(*) from user where username='abcd' and password='' or '1'='1'
PreparedStatement
- 带有预编译效果的执行SQL语句的对象。
- 通过此对象可以解决SQL注入的问题。
将编译SQL语句的时间点从执行时提前到了创建时, 在创建PreparedStatement对象时将SQL语句进行编译,此时用户输入的内容还没有放到SQL语句里面, 这时编译的好处是将SQL语句业务逻辑锁死, 之后再将用户输入的内容添加进去,这样原有SQL语句的逻辑就不会被用户输入的内容改动,从而避免了SQL注入的问题。
String sql = "select count(*) from user where username=? and password=?";PreparedStatement ps = conn.prepareStatement(sql);//替换掉?ps.setString(1,username);ps.setString(2,password);ResultSet rs = ps.executeQuery();
改进上篇注册
//获取连接try (Connection conn = DBUtils.getConn()) {//查询用户名是否存在String sql = "select id from user1 where username=?" ;PreparedStatement ps = conn.prepareStatement(sql);ps.setString(1,username);ResultSet rs = ps.executeQuery();if (rs.next()) {System.out.println("用户名已存在!");return;//结束方法}//代码继续执行说明没有注册过String regSql = "insert into user1 values(null,?,?,?)";PreparedStatement regPs = conn.prepareStatement(regSql);regPs.setString(1,username);regPs.setString(2,password);regPs.setString(3,nick);regPs.executeUpdate();//执行注册System.out.println("注册完成!");} catch (SQLException throwables) {throwables.printStackTrace();}