在數據庫中生成 一個用戶表 有用戶名 username 和密碼password 字段 並插入兩組數據java
正常的sql查詢結果mysql
非正常查詢途徑返回的結果sql
下面用一段java代碼 演示一下用戶登陸時的sql注入問題數據庫
package demo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Scanner; import com.mysql.jdbc.Driver; /* * Java程序實現用戶登陸,用戶名和密碼,數據庫檢查 * 演示被別人攻擊 */ public class JDBCDemo2 { public static void main(String[] args) throws ClassNotFoundException, SQLException { //1.註冊驅動 Class.forName("com.mysql.jdbc.Driver"); //2.獲取鏈接 String url="jdbc:mysql://localhost:3306/mybase"; String username="root"; String password="123456"; Connection conn=DriverManager.getConnection(url,username,password); //3.建立方法執行對象 Statement stat=conn.createStatement(); Scanner sc=new Scanner(System.in); System.out.print("請輸入用戶名:"); String user=sc.nextLine(); System.out.print("請輸入密碼:"); String pwd=sc.nextLine(); //執行SQL語句,數據表,查詢用戶名和密碼,若是存在,登錄成功,不存在登錄失敗 String sql="select * from users where username='"+user+"' and password='"+pwd+"'"; System.out.println(sql); ResultSet rs=stat.executeQuery(sql); while(rs.next()){ System.out.println(rs.getString("username")+" "+rs.getString("password")); } rs.close(); stat.close(); conn.close(); } }
控制檯輸入 輸出url
剛剛控制檯輸入的用戶名是存在的spa
下面輸入瞎寫的用戶名和密碼一樣能夠獲得全部用戶名和對應的密碼,此謂sql的注入攻擊3d
解決方式,使用Statement的子類接口 PrepareStatementcode
該接口是由數據庫廠商提供實現類方法,咱們直接調用便可,使用這個子類接口,完美解決了上述問題,因此成爲java 鏈接數據庫執行的一個標準步驟對象
package demo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Scanner; /* * Java程序實現用戶登陸,用戶名和密碼,數據庫檢查 * 防止注入攻擊 * Statement 接口實現類,做用執行SQL語句,返回結果集 * 有一個子接口PreparedStatement (SQL預編譯存儲,屢次高效的執行SQL) * PreparedStatement prepareStatement(String sql) * */ public class JDBCDemo3 { public static void main(String[] args) throws ClassNotFoundException, SQLException { Class.forName("com.mysql.jdbc.Driver"); String url="jdbc:mysql://localhost:3306/mybase"; String username="root"; String password="123456"; Connection con=DriverManager.getConnection(url,username,password); Scanner sc=new Scanner(System.in); System.out.println("請輸入用戶名:"); String user=sc.nextLine(); System.out.println("請輸入密碼:"); String pwd=sc.nextLine(); String sql="select * from users where username=? and password=?"; PreparedStatement ps=con.prepareStatement(sql); ps.setObject(1, user); ps.setObject(2, pwd); ResultSet rs=ps.executeQuery(); while(rs.next()){ System.out.println(rs.getString("username")+" "+rs.getShort("password")); } rs.close(); ps.close(); con.close(); } }
正確輸入後的輸出blog
故技重施:來一次sql注入
發覺根本不行!