簡體   English   中英

使用 PHP 的 PDO 安全刪除 SQL 查詢中的變量表名

[英]Variable table name in delete SQL query with PHP's PDO safely

我正在嘗試創建一個函數,允許我刪除表中的某一行。 我想將該函數用於幾個不同的表,因此當我調用該函數時,我會將函數的參數之一設為表名。 這是我正在嘗試做的一個例子:

function delete($conn, $table, $id) {
    $stmt = $conn->prepare("DELETE FROM ".$table." WHERE id = :id");
    $stmt->bindParam(":id", $id, PDO::PARAM_INT);
    $stmt->execute();  

    if ($stmt->rowCount() > 0) {
            return true;
    } else {
            return false;
    }
}

我遇到的一個問題是,因為 $table 變量直接進入 SQL 查詢,所以我的數據庫不會面臨 SQL 注入的風險嗎?

正如我從我的其他問題之一中了解到的那樣,我不能只是將 :table 添加到 bindParam 函數中,所以我不知道如何使該函數安全。 有任何想法嗎??

清理表格數據

您可以定義一組列入白名單的表名稱以在您的函數中使用:

$whitelist = array('table1', 'table2', ...)

然后使用:

$myTable= array_intersect_keys($table, array_flip($whitelist));

$myTable現在將是安全的。

作為元數據的表名比行數據更受限制 - 因此清理表名應該比清理數據更可靠。 我當然是指在 PDO 之外進行消毒。

我們經常使用的是一個 PHP 包含,它包含所有有效的表名作為數組定義,所以我們只需查找它 - 如果沒有找到,並且包含的​​文件年齡超過一個小時,我們運行“ SHOW TABLES”並重新創建包含,因此它非常自動。

MySQL 當前不支持動態 SQL 字符串構建,但您可以嘗試使用表的白名單或可能使用 PDO 的准備語句(冗余,我知道)的 MySQL 准備語句。

$sql = "
PREPARE stmt FROM 
'DELETE FROM @tbl WHERE id = :id';
EXECUTE stmt USING :table;
";
$stmt = $db->prepare($sql);
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->bindParam(':table', $table);

這是未經測試的,但可能會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM