- 一切用代码说话
- 首先开启sql 这个 F:\data.log 是自己创建的,这样一来所有执行的sql语句的信息都会保存到F:\data.log 中
SET GLOBAL general_log = 'ON'; SET GLOBAL general_log_file = 'F:\data.log';
-
写一个测试用例
import java.sql.*; public class MySqlJdbcTest { public MySqlJdbcTest() throws Exception{ } public static void main(String[] args) throws Exception { // 这一句是初始化com.mysql.jdbc.Driver 并且返回一个Class 实例 // 从jdk5开始不需要自己手动创建(自动加载),但是为了兼容老程序,还是加上为好。 Class.forName("com.mysql.jdbc.Driver"); Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/weibo","root","123456"); // 上边这个是没有使用预编译语句 Statement statement = conn.createStatement(); ResultSet resultSet = statement.executeQuery("select * from weibo_user where username like 'nami' or 1=1"); while (resultSet.next()){ System.out.println(resultSet.getString(1)); System.out.println(resultSet.getString(2)); } // 下边这个使用了预编译语句 PreparedStatement preparedStatement = conn.prepareStatement("select * from weibo_user where username like ?"); preparedStatement.setString(1, " nami' OR 1=1 OR'1=1 "); ResultSet resultSet1 = preparedStatement.executeQuery(); while (resultSet1.next()){ System.out.println(resultSet1.getString(1)); } } }
-
查看结果 可以看到,没有使用预编译的语句轻易地实现了sql注入,获取了表的所有字段信息,但是使用了预编译语句却不会
-
重点来了 , 为什么不会呢 自己分析最后的那个sql语句,可以看到我们想用于sql 注入的单引号前边被加上了 反斜杠,这样子这个单引号就会被转义了,所以它就没有办法发挥出什么作用了。
面试准备 preparedStatement 为什么可以防止sql 注入
最新推荐文章于 2023-09-15 11:08:19 发布