使用預先準備語句在 MySQL 和 Java 中進行動態列名檢索:一種更安全的方法
許多 MySQL 和 Java 開發人員已經探索使用準備好的語句來檢索具有動態產生的資料列名稱的資料。 但是,不支援直接將列名替換為準備好的語句的參數,這會帶來重大的安全風險。 資料庫架構重新設計通常是最好的解決方案。
嘗試以這種方式使用準備好的語句,如下所示,會導致錯誤:
<code class="language-java">String columnNames = "d,e,f"; String query = "SELECT a,b,c,?" + " FROM " + name + " WHERE d=?"; // This results in "SELECT a,b,c,'d,e,f' FROM some_table WHERE d='x'", not the desired result.</code>
查詢將 ?
佔位符視為字串文字,而不是列名。
為了避免 SQL 注入漏洞,更可靠的方法是將動態列名稱儲存在資料庫本身。 考慮一個像「user_data」這樣的表,其中包含以下列:
id
(主鍵)user_name
column_names
(以逗號分隔的列名稱字串)然後可以透過連接從此表中檢索到的 column_names
來建構 SQL 查詢:
<code class="language-java">String query = "SELECT a,b,c," + columnNames + " FROM " + name + " WHERE d=?";</code>
這種方法確保列名不會被視為容易受到注入攻擊的參數。 雖然它使用字串連接,但易受攻擊的部分(列名)已經透過從資料庫檢索來進行清理。請記住,始終清理查詢建構中使用的任何使用者提供的數據,即使它不是 SQL 語句的直接一部分。 這種修改後的方法為處理動態列名稱提供了更安全、更易於管理的解決方案。
以上是如何在 MySQL 和 Java 中使用預先準備語句檢索具有動態列名的資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!