JDBC: SQL注入问题

1 Sql注入演示 

 

 

 

1) 向jdbc_user表中 插入两条数据

# 插入2条数据 
INSERT INTO jdbc_user VALUES(NULL,'jack','123456','2020/2/24'); 
INSERT INTO jdbc_user VALUES(NULL,'tom','123456','2020/2/24');

 

2) SQL注入演示

# SQL注入演示 
-- 填写一个错误的密码
SELECT * FROM jdbc_user WHERE username = 'tom' AND PASSWORD = '123' OR '1' = '1';

如果这是一个登陆操作,那么用户就登陆成功了。显然这不是我们想要看到的结果

 

2 sql注入案例:用户登录

需求

  用户在控制台上输入用户名和密码, 然后使用 Statement 字符串拼接的方式 实现用户的登录。

步骤 

  1) 得到用户从控制台上输入的用户名和密码来查询数据库 

  2) 写一个登录的方法

    a) 通过工具类得到连接

    b) 创建语句对象,使用拼接字符串的方式生成 SQL 语句

    c) 查询数据库,如果有记录则表示登录成功,否则登录失败    

    d) 释放资源

Sql注入方式: 
  <1> 控制台输入用户名: 任意字符串
  <2> 控制台输入密码: XXX' 加上 or '1' = '1

代码示例

public class TestLogin01 {

     /**
         * 用户登录案例
         * 使用 Statement字符串拼接的方式完成查询
         * @param args
         */

  public static void main(String[] args) throws SQLException {

         //1.获取连接
         Connection connection = JDBCUtils.getConnection();

         //2.获取Statement
         Statement statement = connection.createStatement();

         //3.获取用户输入的用户名和密码
         Scanner sc = new Scanner(System.in);
         System.out.println("请输入用户名: ");
         String name = sc.nextLine();
 
         System.out.println("请输入密码: ");
         String pass = sc.nextLine();
         System.out.println(pass);

         //4.拼接Sql,执行查询
    
        String sql = "select * from jdbc_user " +                "where username = " + " '" + name +"' " +" and password = " +" '" + pass +"'";

         System.out.println(sql);
         ResultSet resultSet = statement.executeQuery(sql);

          //5.处理结果集,判断结果集是否为空
          if(resultSet.next()){  
                 System.out.println("登录成功! 欢迎您: " + name);
          }else {
                 System.out.println("登录失败!");
          }

          //6. 释放资源
          JDBCUtils.close(connection,statement,resultSet);
       }
}
          

3 问题分析

  1) 什么是SQL注入?

    我们让用户输入的密码和 SQL 语句进行字符串拼接。

               用户输入的内容作为了 SQL 语句语法的一部分,改变了 原有 SQL 真正的意义,以上问题称为 SQL 注入 . 

 

  2) 如何实现注入 

    根据用户输入的数据,拼接处的字符串

select * from jdbc_user where username =  'abc'  and password =  'abc' or '1'='1'
 
name='abc' and password='abc' 为假 '1'='1' 真 
 
相当于 select * from user where true=true; 查询了所有记录

 

 

  3) 如何解决

    要解决 SQL 注入,就不能让用户输入的密码,和我们的 SQL 语句进行简单的字符串拼接

    (见下篇)

posted @ 2021-07-22 14:55  Jasper2003  阅读(88)  评论(0编辑  收藏  举报