SQL 準備語句與表格名稱:常見陷阱
準備好的語句對於安全 SQL 查詢、防止 SQL 注入漏洞至關重要。 然而,一個常見的誤解是表名可以在準備好的語句中參數化。 這是不正確的。
以下範例說明了這個問題:嘗試使用預準備語句使用參數 (query1
) 和像 [?]
這樣的變數來動態指定表名(例如 reportDate
)將會失敗。 錯誤「參數‘Pa_RaM000’指定了需要表名的位置」突出了這一限制。
解:在準備好的語句之外進行動態構造
核心問題是 SQL 解析器處理表名與其他查詢參數的方式不同。 它們無法透過準備好的語句佔位符動態注入。
正確的方法是在使用準備好的語句之前動態構造表名稱。 這是透過將包含日期部分(例如 reportDate
)的變數與表格名稱的固定部分連接來完成的:
<code class="language-sql">private String query1 = "SELECT plantID, edrman, plant, vaxnode FROM [" + reportDate + ".?]";</code>
這裡,reportDate
提供表名稱的特定於日期的部分,它與靜態部分組合在一起。 然後,可以在準備好的語句本身中安全地參數化 SELECT
語句中的其餘參數。
此方法允許動態查詢生成,同時保持資料值準備語句的安全優勢。
以上是為什麼在 SQL 中不能對錶名使用預準備語句?的詳細內容。更多資訊請關注PHP中文網其他相關文章!