首頁 > 資料庫 > mysql教程 > 如何在準備好的語句中安全地使用動態表和欄位名稱?

如何在準備好的語句中安全地使用動態表和欄位名稱?

Susan Sarandon
發布: 2024-12-08 17:10:12
原創
564 人瀏覽過

How Can I Safely Use Dynamic Table and Field Names in Prepared Statements?

使用準備好的語句綁定標識符和關鍵字

問題:

建立動態查詢使用準備好的語句,但嘗試綁定表名、欄位名稱或語法關鍵字會導致一個空數組。

代碼:

function search_db($db, $searchTerm, $searchBy, $searchTable){
    try{
        $stmt = $db->prepare('
            SELECT 
                * 
            FROM 
                ?
            WHERE 
                ? LIKE ?
        ');
        $stmt->bindParam(1, $searchTable);
        $stmt->bindParam(2, $searchBy);
        $stmt->bindValue(3, '%'. $searchTerm.'%');
        $stmt->execute();
    } catch(Exception $e) {
        return array();
    }
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
登入後複製

預期結果:
來自資料庫的結果陣列。

實際結果:
空數組。

原因:
準備好的語句只能綁定資料文字,不能綁定識別碼(例如表或欄位名稱)或語法關鍵字。

解決方案:

要使用動態識別碼或關鍵字,請依照下列步驟操作步驟:

  1. 格式識別碼:

    • 將識別符括在反引號:「identifier」。
    • 轉義內的反引號透過將它們加倍來獲得識別符: 「識別符」。
  2. 白名單動態值:

    • 建立允許的識別碼或關鍵字清單。
    • 使用前對照白名單檢查動態值

修改代碼:

$field = "`" . str_replace("`", "``", $field) . "`";
$table = "`" . str_replace("`", "``", $table) . "`";
$sql = "SELECT * FROM $table WHERE $field = ?";
登入後複製

關鍵字:

如果必要時,也可以將動態關鍵字列入白名單並驗證動態關鍵字。透過遵循這些準則,您可以安全地在準備好的語句中包含動態標識符和關鍵字。

以上是如何在準備好的語句中安全地使用動態表和欄位名稱?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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