問題:
在提供的 PHP 中程式碼,使用 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注入和其他SQL攻擊。
Prepared statements 為防止 SQL 注入提供了更強大的解決方案。它們將資料和指令分開,確保使用者提供的輸入不會幹擾查詢的結構。
對於無法使用準備好的語句的情況,為特定目的實施嚴格的白名單可以提供一些保護。這涉及為每個參數定義可接受值的預定列表,以防止惡意輸入。
使用白名單和類型轉換的範例:
switch ($sortby) { case 'column_b': case 'col_c': // Safe to use break; default: $sortby = 'rowid'; } $start = (int) $start; $howmany = (int) $howmany; if ($start < 0) { $start = 0; } if ($howmany < 1) { $howmany = 1; } // Execute the query using prepared statements $stmt = $db->prepare( "SELECT * FROM table WHERE col = ? ORDER BY {$sortby} ASC LIMIT {$start}, {$howmany}" ); $stmt->execute(['value']); $data = $stmt->fetchAll(PDO::FETCH_ASSOC);
確保準備好的語句與模擬準備已關閉,特別是使用 MySQL 時。
$db->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);
以上是`mysqli_real_escape_string` 足以防止 SQL 注入嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!