一.JDBC优化:
优化前提:
有时候我们并不清楚某些表当中一共有多少列,以及这些列的数据类型,这个时候我们就需要提前通过一些方法提前了解到这些数据,从而更好的进行输出
具体语句:
package cn.jdbc; import java.sql.*; public class JDBCDEmo1 { public static void main(String[] args) throws SQLException { // JDBC代码编写步骤 // 1.注册驱动 DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver()); // 2.获取连接 // 在3306/后面加上自己查询的数据库的名称 Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc1","root","123456"); // 3.执行SQL Statement statement = connection.createStatement(); // 填写需要的SQL语句即可 ResultSet resultSet = statement.executeQuery("select * from jdbcdemo1"); //优化操作: //先获取表一共有多少列,获取其列数 ResultSetMetaData metaData = resultSet.getMetaData(); int columnCount = metaData.getColumnCount(); //在这里,conlumnCount代表的就是获得的表的列数 // 4.处理结果集 while(resultSet.next()){ //已经获取到了一共有多少行数,之后就可以采用循环的方式对于每一列放在同一行当中进行输出 // resultSet.get(?)() 但是在这里需要注意的一点是,我们并不清楚每一列的数值类型,所以我们可以直接使用getObject的方式 for (int i = 1; i <=columnCount; i++) { //在这里获取的是一行当中第i列的数值 System.out.print(resultSet.getObject(i)+" "); } //一行的所有列都进行输出了之后就需要我们进行换行操作,再进行下一行的每一列的操作 System.out.println(); } // 5.关闭连接 释放资源 resultSet.close(); statement.close(); connection.close(); } }
二:有关MYSQL的SQL语言注入
1.介绍:
SQL注入: 指的是对于用户输入的内容,变成了SQL语句当中的一部分,从而改变了SQL语句真正意义
2.具体操作演示:
package cn.jdbc; import java.sql.*; import java.util.Scanner; public class JDBCDEmo2 { public static void main(String[] args) throws SQLException { Scanner in =new Scanner(System.in); // SQL注入: 指的是对于用户输入的内容,变成了SQL语句当中的一部分,从而改变了SQL语句真正意义 System.out.println("请输入您的用户名"); String username=in.next(); System.out.println("请输入您的密码"); String password=in.next(); // 1.注册驱动 DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver()); // 2.获取连接 // 在3306/后面加上自己查询的数据库的名称 Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc2","root","123456"); // 3.执行SQL Statement statement = connection.createStatement(); //提前设置SQL语句 //如果密码正确可以直接机内 String sql ="select * from user where username='"+username+"'and password='"+password+"'"; ResultSet resultSet = statement.executeQuery(sql); //判断是否存在数据,如果输入正确则能够查询到并输出 if (resultSet.next()){ System.out.println("登陆成功!"); } else { System.out.println("登录失败!"); } connection.close(); resultSet.close(); statement.close(); }
在这里,我们拿我MSQL当中的JDBC2的表user表格作为数据参考
输入正确的用户名,密码,可以正常的进入:
但是,如果输入某些特殊的字符,就有可能导致原本错误的变成了正确的数据,从而进入到其中,也就是输入的东西对于SQL语句造成了某些改变
可以看到账号密码明显不正确,但是依然显示登录成功
通过对于SQL语句的打印,发现是输入的密码让原本的SQL语句的意义发生了改变,因为or之后的1=1永远成立,因此不管密码账号是否是正确的,都一直都能够登录成功
3.SQL注入解决方式
// 3.执行SQL Statement statement = connection.createStatement(); //提前设置SQL语句 //如果密码正确可以直接机内 // 在这里,我们将需要用户输入的数据改为 ? 之后进行处理 String sql ="select * from user where username=? and password=?"; PreparedStatement preparedStatement = connection.prepareStatement(sql); // 之后调用相应的SETOBJECT方法,设置第一个?代表的什么变量,以及第二个代表什么变量,从而让SQL语句变得更加的完整 preparedStatement.setObject(1,username); preparedStatement.setObject(2,password); // 在这里,我们不需要再进行输入相应的SQL语句,再预处理的时候已经接受到了SQL语句 // 并且需要注意的是,使用的是预处理(prepareStatement)的方法 ResultSet resultSet = preparedStatement.executeQuery();
经过预处理之后,再输入相应的语句,再进行测试
发现已经解决相关SQL注入问题
感谢观看OVER!