[英]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.