JDBC: SQL注入問題
阿新 • • 發佈:2021-07-22
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 = newScanner(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 語句進行簡單的字串拼接
(見下篇)