mysqli_real_escape_string 足以緩解 SQL 注入和攻擊嗎?
儘管 mysqli_real_escape_string 被廣泛使用,但它並不是對 SQL 注入的堅不可摧的防禦。如提供的範例所示:
$email = mysqli_real_escape_string($db_con, $_POST['email']); $psw = mysqli_real_escape_string($db_con, $_POST['psw']); $query = "INSERT INTO `users` (`email`, `psw`) VALUES ('$email', '$psw')";
此程式碼嘗試透過使用 mysqli_real_escape_string 轉義單引號來防止惡意輸入。然而,這種方法仍然容易受到 SQL 注入的攻擊,正如以下攻擊所示:
myEmail = 'user@example.com' OR 0 = 1
在這種情況下,注入利用了 mysqli_real_escape_string 僅轉義單引號這一事實。透過在 email 欄位中註入字串 myEmail = 'user@example.com' OR 0 = 1,攻擊者可以繞過身份驗證並獲得未經授權的存取。
要有效防止 SQL 注入,請考慮使用準備好的語句或參數化語句查詢。這些機制嚴格地將資料與指令分開,消除了輸入污染的可能性。
準備好的語句使用使用者提供的參數執行查詢。這些值會安全地插入查詢中,而不會改變其結構。例如:
$stmt = $mysqli->prepare("INSERT INTO `users` (`email`, `psw`) VALUES (?, ?)"); $stmt->bind_param("ss", $email, $psw);
在準備好的語句不可行的情況下,實作嚴格的白名單來限制允許的輸入。這確保了只處理安全值。
總之,雖然 mysqli_real_escape_string 提供了一些針對 SQL 注入的保護,但它並不是萬無一失的。準備好的語句或參數化查詢以及白名單提供了針對這些攻擊的更強大的防禦機制。
以上是`mysqli_real_escape_string` 足以防止 SQL 注入嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!