• jdbc java数据库连接 8)防止sql注入


    回顾下之前jdbc的开发步骤:

      1:建项目,引入数据库驱动包

      2:加载驱动

        Class.forName(..);

      3:获取连接对象

      4:创建执行sql语句的stmt对象;  sql

      5:执行sql

        a) 更新    delete/insert/update

          !:executeUpdate();       

        b) 查询    select  

          !:executeQuery();

      6:关闭/异常

    之前有说过,Statement接口和PreparedStatement接口的区别,其中的一个就是:

      PreparedStatement接口能够防止sql注入

    那么,什么是sql注入呢?

      其实sql注入就是用户输入的恶意密码,能够绕过你的用户名和密码登陆。

    例子:

      1:首先创建个数据库

    1 -- 创建数据库
    2 CREATE DATABASE jdbc_demo DEFAULT CHARACTER SET utf8;i
    3 -- 创建表
    4 USE jdbc_demo;
    5 CREATE TABLE admin(
    6     id INT PRIMARY KEY AUTO_INCREMENT,
    7     userName VARCHAR(20),
    8     pwd VARCHAR(20)
    9 )

      

      2:使用Statement接口,没有防止sql注入:

     1 /**
     2  * 模拟用户登陆数据库,演示注入
     3  * 
     4  * @author LLZ
     5  */
     6 public class Two_StatementDemo {
     7 
     8     /**
     9      * 1:sql注入 Statement
    10      */
    11 
    12     private Connection conn;
    13     private Statement stsm;
    14     private ResultSet rs;
    15     private PreparedStatement pstsm;
    16 
    17     @Test
    18     public void Test1() {
    19 
    20         String user = "tom";
    21         // String password = "123";
    22         String password = " ' or 1=1 -- /**/ "; // sql注入,这个也可以登陆成功
    23 
    24         try {
    25             // 1.1:加载驱动
    26             conn = Jdbcutil.getConnection();
    27 
    28             // 1.3:创建Statement对象
    29             stsm = conn.createStatement();
    30 
    31             // 1.4:准备sql语句
    32             String sql = "select * from jdbc where user='" + user
    33                     + "'  and password='" + password + "' ";
    34 
    35             // 1.5:执行sql
    36             rs = stsm.executeQuery(sql);
    37 
    38             // 1.6:打印返回的结果
    39             if (rs.next()) {
    40                 System.out.println(rs.getInt("id"));
    41             }
    42         } catch (Exception e) {
    43             e.printStackTrace();
    44 
    45         } finally {
    46             // 1.7:关闭连接
    47             try {
    48                 rs.close();
    49                 stsm.close();
    50                 conn.close();
    51             } catch (Exception e) {
    52 
    53                 e.printStackTrace();
    54             }
    55         }
    56     }

      3:使用PreparedStatement接口,防止sql注入:

    其原因就是由于该接口具有缓存区,需要先执行预编译远,等传入参数才正式执行sql语言

     1 /**
     2      * 二:用PreparedStatement防止sql注入
     3      */
     4     @Test
     5     public void Test2() {
     6 
     7         String user = "tom";
     8         String password = "123";
     9         // String password = " ' or 1=1 -- /**/ "; // sql注入,这个在这里就无法登陆
    10         // 准备sql预编译语句
    11         String sql = "select * from jdbc where user=? and password=?";
    12 
    13         try {
    14             // 2.1:创建连接
    15             conn = Jdbcutil.getConnection();
    16 
    17             // 2.2:创建PerparedStatement对象(执行预编译)
    18             pstsm = conn.prepareStatement(sql);
    19 
    20             // 2.3:准备参数
    21             pstsm.setString(1, user);
    22             pstsm.setString(2, password);
    23 
    24             // 2.4:发送参数,执行sql
    25             ResultSet rs = pstsm.executeQuery();
    26             if (rs.next()) {
    27                 System.out.println(rs.getInt("id"));
    28             }
    29         } catch (Exception e) {
    30             e.printStackTrace();
    31         } finally {
    32             // 2.5:关闭连接
    33             Jdbcutil.close(conn, pstsm, rs);
    34         }
    35 
    36     }
  • 相关阅读:
    Airtest操作多台云手机,进行分发,多个脚本后端调度
    Airtest常见的元素定位不到
    pythonDES加密与解密以及hex输出和bs64格式输出
    adb命令将抓包工具证书从用户目录移动至系统目录,解决反爬对于本地证书认证
    解决appium每次app启动时候已登入账号会登出
    PHP数组循环遍历的几种方式
    TP5.1/TP框架的访问控制,访问不存在的模块、控制器、方法等控制
    PHP常用数组函数
    TP5截取部分字符串
    apache虚拟主机配置及解析
  • 原文地址:https://www.cnblogs.com/LZL-student/p/6017377.html
Copyright © 2020-2023  润新知