面试准备 preparedStatement 为什么可以防止sql 注入

  1. 一切用代码说话
  2. 首先开启sql 这个 F:\data.log 是自己创建的,这样一来所有执行的sql语句的信息都会保存到F:\data.log 中
     SET GLOBAL general_log = 'ON';
     SET GLOBAL general_log_file = 'F:\data.log';

     

  3. 写一个测试用例

    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));
            }
    
        }
    }
    

     

  4. 查看结果  可以看到,没有使用预编译的语句轻易地实现了sql注入,获取了表的所有字段信息,但是使用了预编译语句却不会

  5. 重点来了 , 为什么不会呢  自己分析最后的那个sql语句,可以看到我们想用于sql 注入的单引号前边被加上了 反斜杠,这样子这个单引号就会被转义了,所以它就没有办法发挥出什么作用了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值