PHP中防止SQL注入的方式主要有兩種:
- 使用預處理語句
預處理語句是將查詢語句提前準備好,然後再將參數傳遞到查詢語句中,這樣可以防止SQL注入攻擊。在PHP中,我們可以使用PDO或mysqli擴展來實現預處理語句。以下是使用mysqli實現預處理語句的示例代碼:
// 數據庫連接
$host = 'localhost';
$user = 'username';
$pass = 'password';
$dbName = 'database_name';
$db = mysqli_connect($host, $user, $pass, $dbName);
if (!$db) {
die("無法連接到數據庫: " . mysqli_connect_error());
}
// 防止SQL注入
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$username = $_POST['username'];
$password = $_POST['password'];
$stmt = $db->prepare("SELECT * FROM users WHERE username=? AND password=?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
$result = $stmt->get_result();
// 處理查詢結果
}在上述代碼中,我們使用了mysqli的prepare()函數來準備查詢語句,其中使用了參數佔位符(?)來代替實際的參數。然後使用了bind_param()函數來綁定參數,其中第一個參數“ss”表示後面的參數都是字符串類型,這樣可以確保參數傳遞時正確,避免了SQL注入的風險。
- 對特殊字符進行轉義
除了使用預處理語句,我們也可以對特殊字符進行轉義,例如使用mysqli_real_escape_string函數,該函數將特殊字符轉義爲安全字符。以下是對特殊字符進行轉義的示例代碼:
// 數據庫連接
$host = 'localhost';
$user = 'username';
$pass = 'password';
$dbName = 'database_name';
$db = mysqli_connect($host, $user, $pass, $dbName);
if (!$db) {
die("無法連接到數據庫: " . mysqli_connect_error());
}
// 防止SQL注入
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$username = mysqli_real_escape_string($db, $_POST['username']);
$password = mysqli_real_escape_string($db, $_POST['password']);
$sql = "SELECT * FROM users WHERE username='$username' AND password='$password'";
$result = mysqli_query($db, $sql);
// 處理查詢結果
}在上述代碼中,我們使用了mysqli_real_escape_string函數對數據進行了轉義,確保了輸入的數據不包含特殊字符,從而防止了SQL注入攻擊。