1. 程式人生 > 其它 >JDBC: SQL注入問題

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'= '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("登入失敗!"); } //釋放資源 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 語句進行簡單的字串拼接

    (見下篇)