JAVA-JDBC解决SQL注入问题
2020-03-01 09:26
417 查看
只要用户提供信息不参与SQL语句的编译过程,问题就解决了。
即使用户提供的信息中含有SQL语句的关键字,但是没有参与编译,不起作用。
PreparedStatement预操作
使用java.sql.PreparedStatement,其继承了java.sql.Statement
PreparedStatement是属于与编译的数据库操作对象。
import java.sql.*; public class JDBCTest04 { public static void main(String[] args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { //1.注册驱动 Class.forName("com.mysql.jdbc.Driver"); //2.获取连接 conn = DriverManager.getConnection("jdbc:mysql://localhost/test","root","xxx"); //3.获取数据库操作对象 // 其中一个?,表示一个占位符,一个?将来接受一个“值”,注意:占位符不能使用单引号括起来。 String sql = "SELECT * FROM t_user WHERE id = ? AND c_id =?"; ps = conn.prepareStatement(sql); // 给占位符?传值 ps.setInt(1,2); ps.setInt(2,101); //4.执行sql //excuteUpdate rs = ps.executeQuery(); //专门执行DQL语句的方法 //5.处理查询结果 while (rs.next()){ String id = rs.getString("id"); String username = rs.getString("username"); String c_id = rs.getString("c_id"); System.out.println(id + "," + username + "," + c_id); } }catch (Exception e){ e.printStackTrace(); }finally { if (rs != null){ try{ rs.close(); }catch (Exception e){ e.printStackTrace(); } } if (ps != null){ try{ ps.close(); }catch (Exception e){ e.printStackTrace(); } } if (conn != null){ try{ conn.close(); }catch (Exception e){ e.printStackTrace(); } } } } }
Statement和PreparedStatement对比
- Statement存在SQL注入,PreparedStatement解决了SQL注入问题。
- Statement是编译一次执行一次,PreparedStatement是编译一次,可执行N次。PreparedStatement效率更高。
- PreparedStatement会在编译阶段做类型的安全检查。
综述:PreparedStatement使用情况较多。只有极少数的情况下需要使用Statement
什么情况下必须使用Statement
- 业务方面要求必须支持SQL注入
- statement支持SQL注入,凡是业务方面要求是需求进行SQL语句拼接的,必须使用statement。(例如在order by 后面加asc或者desc)
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- java jdbc连接Access数据库 出现中文乱码问题解决
- 关于在java中连接MS SQL Server 2005 JDBC的问题及解决办法
- JDBC学习笔记(6):PreparedStatement解决SQL注入问题
- JAVA之JDBC的相关问题(无法与SQLServer连接的解决)
- 有关在Linux虚拟机和Windows下Java JDBC问题与解决
- java连接sqlserver数据库jdbc提示对象名无效问题的解决方法
- 关于在java中连接MS SQL Server 2005 JDBC的问题及解决办法
- java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver问题解决
- Caused by: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver问题解决方案
- 解决java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver问题
- java.lang.AbstractMethodError: com.mysql.jdbc.Connection.isValid(I)Z问题解决
- 解决java.lang.ClassNotFoundException: com.mysql.jdbc.Driver问题(真实有效)
- java.lang.NoClassDefFoundError: com.mysql.jdbc.Driver问题解决
- 解决问题:java.lang.AbstractMethodError: com.microsoft.jdbc.base.BasePreparedStatement.getParameterMetaData...
- java操作数据库出现(][SQLServer 2000 Driver for JDBC]Error establishing socket.)的问题所在即解决办法
- Java连接SQL Server2005 “Failed to load the sqljdbc_auth.dll” 问题解决
- java.lang.NullPointerException at oracle.jdbc.dbaccess.DBData.clearItem(DBData.java:431)问题解决
- java乱码 ferdora下解决问题心得 jdbc
- Java 原生态JDBC问题总结及MyBatis解决方法
- 解决JAVA通过JDBC连接Oracle数据库出现的问题