- sql注入
- 概念
- 所谓sql注入,即用户输入的字符串和我们的sql结合产生预判之外的结果,比如下面这段判断用户名密码是否正确的代码
- String sql = "SELECT * FROM user WHERE " + "username='" + username + "' and password='" + password + "'";
- rs = stmt.executeQuery(sql);
- 如果用户输入为:"a' or 'a'='a", "a' or 'a'='a"
- 最后执行的sql语句为:SELECT * FROM tab_user WHERE username='a' or 'a'='a' and password='a' or 'a'='a'
- 可以发现这句sql的where条件是永真,其执行结果是返回tab_user表中所有行
- 所谓sql注入,即用户输入的字符串和我们的sql结合产生预判之外的结果,比如下面这段判断用户名密码是否正确的代码
- 防范有三种方法
- 过滤用户输入的数据中是否包含非法字符;
- 分步校验!先使用用户名来查询用户,如果查找到了,再比较密码;
- 使用PreparedStatement
- PreparedStatement叫预编译声明!
- PreparedStatement是Statement的子接口,你可以使用PreparedStatement来替换Statement。
- PreparedStatement的好处:
- 防止SQL攻击;
- 提高代码的可读性,以可维护性;
- 提高效率。
- 如何使用
- 使用方法
- 1.使用Connection的prepareStatement(String sql):即创建它时就让它与一条SQL模板绑定;
- 2.调用PreparedStatement的setXXX()系列方法为问号设置值
- 3.调用executeUpdate()或executeQuery()方法,但要注意,调用没有参数的方法;
- String sql = “select * from tab_student where s_number=?”;
- PreparedStatement pstmt = con.prepareStatement(sql);
- pstmt.setString(1, “S_1001”);
- ResultSet rs = pstmt.executeQuery();
- rs.close();
- pstmt.clearParameters();
- pstmt.setString(1, “S_1002”);
- rs = pstmt.executeQuery();
- 在使用Connection创建PreparedStatement对象时需要给出一个SQL模板,所谓SQL模板就是有“?”的SQL语句,其中“?”就是参数。
- 在得到PreparedStatement对象后,调用它的setXXX()方法为“?”赋值,这样就可以得到把模板变成一条完整的SQL语句,然后再调用PreparedStatement对象的executeQuery()方法获取ResultSet对象。
- 注意PreparedStatement对象独有的executeQuery()方法是没有参数的,而Statement的executeQuery()是需要参数(SQL语句)的。因为在创建PreparedStatement对象时已经让它与一条SQL模板绑定在一起了,所以在调用它的executeQuery()和executeUpdate()方法时就不再需要参数了。
- PreparedStatement最大的好处就是在于重复使用同一模板,给予其不同的参数来重复的使用它。这才是真正提高效率的原因。
- 所以,建议大家在今后的开发中,无论什么情况,都去需要PreparedStatement,而不是使用Statement。
- 概念
- 使用PreparedStatement之后的程序
//查询两个结果 Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection( "jdbc:mysql://localhost:3306/ecshop?useUnicode=true&characterEncoding=UTF8", "root", "123456"); String sql = "Select * from ecs_article where article_id=? and title=?" ; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setInt(1, 1); pstmt.setString(2, "免责条款"); ResultSet rs = pstmt.executeQuery(); while(rs.next()) { int id = rs.getInt(1); String title = rs.getString(3); System.out.println(id + ", " + title); } rs.close(); pstmt.clearParameters(); pstmt.setInt(1, 2); pstmt.setString(2, "隐私保护"); rs = pstmt.executeQuery(); while(rs.next()) { int id = rs.getInt(1); String title = rs.getString(3); System.out.println(id + ", " + title); } //释放资源,顺序和创建的顺序相反 rs.close(); pstmt.close(); con.close();
java连接数据库操作2--防止sql注入
最新推荐文章于 2023-11-30 17:37:03 发布