MySQL-演示如何防止注入攻擊
阿新 • • 發佈:2018-12-11
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語句,返回結果集 * Statement有一個子介面PreparedStatement,用來SQL預編譯儲存,多次高效的執行SQL,還可以防止被攻擊 * PreparedStatement的實現類也在資料庫的驅動中. * * 如何獲取介面的實現類? * * PreparedStatement prepareStatement(String sql): * 是Connection資料庫連線物件的方法,可以獲取PreparedStatement介面的實現類 * */ public class JDBCDemo4 { public static void main(String[] args) throws ClassNotFoundException, SQLException { // url,username,password是自己設定的 Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/mybase"; Connection con = DriverManager.getConnection(url, "root", "root"); // sql語句,使用此子介面,sql語句中所有引數全部採用問號佔位符 Scanner sc = new Scanner(System.in); String username = sc.nextLine(); String password = sc.nextLine(); String sql = "SELECT * FROM users WHERE username=? AND PASSWORD=? "; // 呼叫Connection介面的方法PreparedStatement PreparedStatement pst = con.prepareStatement(sql); // 呼叫pst物件的set方法,設定問號佔位符上的引數 // 第一個引數為第幾個問號,第二個為引數的名字 pst.setObject(1, username); pst.setObject(2, password); // 呼叫方法,執行sql語句,獲取結果集 ResultSet rs = pst.executeQuery(); while (rs.next()) { System.out.println(rs.getString("username") + " " + rs.getString("password")); } //釋放資源 rs.close(); pst.close(); con.close(); } }
結果:
注入攻擊:
會發現沒有反應,
使用Statement子介面PreparedStatement,成功防止了注入攻擊.