準備好的語句和表名安全性:嚴格檢查
許多開發人員依賴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中文網其他相關文章!