MySQLi 的「mysqli_real_escape_string」足以抵禦 SQL 攻擊嗎?
您的程式碼嘗試使用「mysqli_real_escape_string()」來防止 SQL 注入。然而,正如 uri2x 所顯示的,這種措施是不夠的。
SQL 注入漏洞
「mysqli_real_escape_string()」僅轉義某些字符,使您的查詢容易受到 SQL 攻擊注入攻擊。例如,以下程式碼仍然可能容易受到攻擊:
$email = mysqli_real_escape_string($db_con, $_POST['email']); $query = "SELECT * FROM users WHERE email = '" . $email . "'";
攻擊者可以輸入類似「email'@example.com」的電子郵件地址來利用查詢,在轉義輸入後添加其他 SQL 語句。
使用準備好的語句
而不是“mysqli_real_escape_string()”,防止SQL注入最有效的方法是使用準備好的語句。預準備語句將資料與查詢字串分開,防止資料污染。
$stmt = $db_con->prepare("INSERT INTO users (email, psw) VALUES (?, ?)"); $stmt->bind_param('ss', $email, $psw); $email = mysqli_real_escape_string($db_con, $_POST['email']); $psw = mysqli_real_escape_string($db_con, $_POST['psw']); $stmt->execute();
嚴格字元白名單
在預備語句不可行的情況下,實施嚴格字元白名單可以保證安全。這涉及到過濾輸入以確保它只包含允許的字元。
結論
僅「mysqli_real_escape_string()」不足以防止 SQL 注入。準備好的聲明和嚴格的白名單提供了針對這些攻擊的更強大的保護措施。
以上是`mysqli_real_escape_string()` 足以防止 SQL 注入攻擊嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!