首頁 > 資料庫 > mysql教程 > `mysqli_real_escape_string` 足以防止 SQL 注入嗎?

`mysqli_real_escape_string` 足以防止 SQL 注入嗎?

DDD
發布: 2024-12-17 20:30:19
原創
224 人瀏覽過

Is `mysqli_real_escape_string` Sufficient to Prevent SQL Injection?

mysqli_real_escape_string 足以防止 SQL 注入嗎?

問題:

在提供的 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板