SQL注入及防止SQL注入
•SQL注入
SQL注入是通過操作輸入來修改事先定義好的SQL語句,對用戶輸入的字元串進行過濾,轉義,限制或處理不嚴謹,導致用戶可以通過輸入精心構造的字元串去非法獲取到資料庫中的數據,以達到執行程式碼對伺服器進行攻擊的方法。
現有一個資料庫test中的表user,可以通過帳號name,密碼pass登錄,查看id
登錄程式碼
package JDBCtest; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.Scanner; /* * 用戶登錄 */ public class Demo4 { public static void main(String[] args) throws Exception { // 1.載入驅動 Class.forName("com.mysql.jdbc.Driver"); // 2.創建連接 String url = "jdbc:mysql:///test"; String username = "root"; String password = "1234"; Connection connection = DriverManager.getConnection(url, username, password); // 接收用戶名密碼 Scanner sc = new Scanner(System.in); String name = sc.next(); String pass = sc.next();// 3.sql語句 String sql = "Select * from user where name='" + name + "' and pass ='" + pass + "'"; // System.out.println(sql); // 4.獲取sql對象statement Statement statement = connection.createStatement(); // 5.執行sql語句 ResultSet rs = statement.executeQuery(sql); // 6.登錄 if (rs.next()) { System.out.println("登錄成功"); } else { System.out.println("登錄失敗"); } // 7.釋放資源 statement.close(); connection.close(); } }
通過表中帳號密碼登錄成功
由於帳號或密碼錯誤登錄失敗
以上可以正確登錄成功或失敗
注意!
如果此時我這樣輸入 【lihua ‘or’1’=’1】,也成功登錄了,但是資料庫沒根本沒有這條數據
這是為什麼呢?讓我們從程式碼里找問題!
String sql = "Select * from user where name='" + name + "' and pass ='" + pass + "'";
為了調用資料庫,使用字元串拼接SQL語句
讓我們列印一下輸入 【lihua ‘or’1’=’1】的sql語句一探究竟
select語句中的where條件可以看做兩組並列(注意and在前先執行,or後執行)
由於’1’=’1’為TRUE,所以以上語句等價於肯定會登錄成功!
同理輸入【’or’1’=’1’# xxx】也能登陸成功
這是由於#在SQL中是注釋符號,以上語句等價於,於是就和上述情況一樣了。