Postgresql

PostgreSQL:PreparedStatement 執行設置模式命令

  • January 6, 2020

我需要在 Java 應用程序中執行一條SET schema ?語句,其中佔位符被呼叫者在執行時提供的值替換。

我以為我可以PreparedStatement用來克服潛在的 SQL 注入,但是如果我嘗試執行準備好的語句,我會收到一條PSQLExceptionwith 消息

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 + "'");

引用自:https://dba.stackexchange.com/questions/222080