• 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 语句进行简单的字符串拼接

        (见下篇)

  • 相关阅读:
    DataTable.Load技巧,多结果集查询
    sql编写小技巧
    最近学习记录
    分享layui的table的一些小技巧,前端分页
    WTM框架在开发过程中如何动态迁移表和创建表
    .net core cookie滑动过期设置
    在使用DapperExtensions时遇到"其他信息: ConnectionString 属性尚未初始化。"错误
    在域环境中客户端三次输入密码错误锁定方法(原创)
    共享打印机提示0x000006cc的解决方法
    win10 1909版本用ultraISO做启动U盘,写入只有1g不到
  • 原文地址:https://www.cnblogs.com/JasperZhao/p/15044118.html
Copyright © 2020-2023  润新知