1. 程式人生 > >MySQL-演示如何防止注入攻擊

MySQL-演示如何防止注入攻擊

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,成功防止了注入攻擊.