iT邦幫忙

2024 iThome 鐵人賽

DAY 14
0

SQL注入是什麼

前幾天分享到寫入database的SQL語法都是PreparedStatement,這是因為使用Statement的話有機會發生SQL注入,SQL注入是一種針對應用程式的攻擊手段,攻擊者利用應用程式未正確處理的輸入,將惡意的SQL語句插入到查詢中。這可能導致數據庫被攻擊者控制、敏感數據洩露、數據被篡改或刪除。

舉個栗子

假設應用程式直接將用戶輸入插入SQL查詢中:

String query = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'";

如果攻擊者輸入的username為'' OR '1'='1'

SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '';

這會繞過帳號密碼的環節,因為'1'='1'始終為真,從而讓攻擊者進入系統。

小結

SQL注入簡單來說就是利用應用程式設計時的缺陷(利用Statement語法登入),來進行一些惡意輸入,像是冒充管理員、惡意刪除資料等等,如果要防範的話最簡單的方法就是使用PreparedStatement。

PreparedStatement

使用Prepared Statements(預先編譯語句) 預先編譯語句將SQL和數據分開處理,防止惡意數據被解釋為SQL語句

String query = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement p = connection.prepareStatement(query);
stmt.setString(1, username);
stmt.setString(2, password);
ResultSet rs = stmt.executeQuery();

如果這樣設計的話,在這裡"?"是佔位符,通過setString來設置具體的值。即使攻擊者試圖在URL中注入惡意程式,它也會被當作普通數據處理,而不是SQL查詢的一部分,從而防止攻擊。那攻擊者輸入username = '' OR '1'='1' 就不會通過身分驗證,因為['' OR '1'='1'] 並不存在於database的user中,所以PreparedStatement才能有效防止SQL注入!


上一篇
D13:撰寫程式碼控制資料庫-寫入、刪除(下)
下一篇
D15:學習Commit處理(上)
系列文
資料庫與Java開發工具連接30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言