首頁 > 資料庫 > mysql教程 > 準備好的語句可以安全地參數化表名嗎?

準備好的語句可以安全地參數化表名嗎?

DDD
發布: 2025-01-23 18:16:14
原創
657 人瀏覽過

Can Prepared Statements Securely Parameterize Table Names?

準備好的語句和表名安全性:嚴格檢查

許多開發人員依賴mysqli_stmt_bind_param來防止SQL注入漏洞。 然而,這種方法在嘗試參數化表名稱時會帶來挑戰。

考慮這個例子:

<code class="language-php">function insertRow($db, $mysqli, $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol) {
    $statement = $mysqli->prepare("INSERT INTO " . $new_table . " VALUES (?,?,?,?,?,?,?);");
    mysqli_stmt_bind_param($statement, 'sssisss', $Partner, $Merchant, $ips, $score, $category, $overall, $protocol);
    $statement->execute();
}</code>
登入後複製

雖然這嘗試透過綁定變數來減輕 SQL 注入,但它使表名 $new_table 容易受到攻擊。 我們可以在準備好的語句中使用 $new_table 佔位符嗎?

不。 資料庫準備好的語句僅支援的參數綁定,而不支援表或列標識符。 這是因為表名對於 SQL 語句的結構和有效性來說是不可或缺的;動態更改它可能會導致無效的 SQL。

即使使用像 PDO 這樣提供更靈活的佔位符使用的資料庫接口,嘗試替換表名也會直接導致無效的 SQL:

<code class="language-sql">SELECT * FROM ?</code>
登入後複製

正確的方法是使用字串插值:

<code class="language-php">SELECT * FROM {$mytable}</code>
登入後複製

但是,這需要一項關鍵的安全措施:嚴格的表白名單。 始終根據允許的表名稱的預先定義清單驗證 $mytable,以防止惡意輸入損害您的資料庫。 切勿只依賴準備好的語句來確保表名安全。

以上是準備好的語句可以安全地參數化表名嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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