• 03009_SQL注入问题


    1、注入问题

      (1)假设有登录案例SQL语句如下:

    SELECT * FROM 用户表 WHERE NAME = 用户输入的用户名 AND PASSWORD = 用户输的密码;

      (2)此时,当用户输入正确的账号与密码后,查询到了信息则让用户登录;

      (3)但是当用户输入的账号为XXX 密码为:XXX' OR ‘a’=’a时,则真正执行的代码变为:

    SELECT * FROM 用户表 WHERE NAME = ‘XXX’ AND PASSWORD =’ XXX’  OR ’a’=’a’;

      (4)此时,上述查询语句时永远可以查询出结果的。那么用户就直接登录成功了,显然我们不希望看到这样的结果,这便是SQL注入问题。

    2、案例演示

      (1)创建表

    CREATE TABLE users(
        id INT PRIMARY KEY AUTO_INCREMENT,
        username VARCHAR(100),
        PASSWORD VARCHAR(100)
    );

      (2)插入数据

    INSERT INTO users (username,PASSWORD) VALUES ('a','1'),('b','2');

      (3)查询表数据

    SELECT * FROM users;

      (4)登录查询

        ①正常查询

    SELECT * FROM users WHERE username='a' AND PASSWORD='1'

        ②账号随意写,1=1为true

    SELECT * FROM users WHERE username='dsfsdfd' AND PASSWORD='wrethiyu' 
    OR 1=1

      (5)代码演示

     1 import java.sql.Connection;
     2 import java.sql.DriverManager;
     3 import java.sql.ResultSet;
     4 import java.sql.Statement;
     5 import java.util.Scanner;
     6 
     7 public class JDBCDemo2 {
     8     public static void main(String[] args) throws Exception {
     9         Class.forName("com.mysql.jdbc.Driver");
    10         String url = "jdbc:mysql://localhost:3306/mybase";
    11         String username = "root";
    12         String password = "root";
    13         Connection con = DriverManager.getConnection(url, username, password);
    14         Statement stat = con.createStatement();
    15 
    16         Scanner sc = new Scanner(System.in);
    17         String user = sc.nextLine();
    18         String pass = sc.nextLine();
    19 
    20         // 执行SQL语句,数据表,查询用户名和密码,如果存在,登录成功,不存在登录失败
    21         // String sql =
    22         // "SELECT * FROM users WHERE username='dsfsdfd' AND PASSWORD='wrethiyu' OR 1=1";
    23         String sql = "SELECT * FROM users WHERE username='" + user
    24                 + "' AND PASSWORD='" + pass + "'";
    25         System.out.println(sql);
    26         ResultSet rs = stat.executeQuery(sql);
    27         while (rs.next()) {
    28             System.out.println(rs.getString("username") + "   "
    29                     + rs.getString("password"));
    30         }
    31 
    32         rs.close();
    33         stat.close();
    34         con.close();
    35     }
    36 }

      运行结果:

      

  • 相关阅读:
    线程池优化之充分利用线程池资源
    Spring异步调用原理及SpringAop拦截器链原理
    使用pdfBox实现pdf转图片,解决中文方块乱码等问题
    Spring BPP中优雅的创建动态代理Bean
    转载:ThreadPoolExecutor 源码阅读
    Springboot定时任务原理及如何动态创建定时任务
    SpringSecurity整合JWT
    SpringMvc接口中转设计(策略+模板方法)
    HashMap 源码阅读
    支付宝敏感信息解密
  • 原文地址:https://www.cnblogs.com/gzdlh/p/8111324.html
Copyright © 2020-2023  润新知