Postgresql
PostgreSQL:PreparedStatement 執行設置模式命令
我需要在 Java 應用程序中執行一條
SET schema ?
語句,其中佔位符被呼叫者在執行時提供的值替換。我以為我可以
PreparedStatement
用來克服潛在的 SQL 注入,但是如果我嘗試執行準備好的語句,我會收到一條PSQLException
with 消息ERROR: syntax error at or near "$1" Position: 18
如果我通過執行以下操作連接架構名稱來執行 SQL:
public void executeSetSchema(Connection con, String schema){ try{ Statement stmt = con.createStatement(); stmt.execute("SET SCHEMA '" + schema + "'"); } catch(Exception){} }
然後一切都按預期工作。
顯然,所有最新版本的 PostgreSQL 都會發生這種情況
為什麼我不能使用 PreparedStatement,我應該怎麼做才能防止 SQL 注入?
您不能將標識符作為參數傳遞。它類似於
select * from ?
但是,您可以使用函式來設置搜尋路徑:
public void executeSetSchema(Connection con, String schema) { try ( PreparedStatement pstmt = con.prepareStatement("select set_config('search_path', ?, false)"); ) { pstmt.setString(1, schema); stmt.execute(); } catch(Exception) { } }
我將
prepareStatement()
呼叫移到了 try-with-resources 中,以便正確關閉語句。
我有工作程式碼
Statement stmt = conn.createStatement(); stmt.execute("set search_path to '" + schema + "'");