給出一個客戶端庫,只能在一個批處理執行一個說法,如果你運行是否包裹在SELECT查詢完全保護你的Postgres
query.exec_sql("SELECT * FROM (" + sql + ")")
是否在某些sql
可以運行任何東西,但SELECT
任何載體?
是否有任何其他方式暫時取消提升連接,以便它只能執行SELECT?
注意:它看起來像SET ROLE解決了這個問題,但我遇到的問題是我無法以簡單的方式創建角色。
給出一個客戶端庫,只能在一個批處理執行一個說法,如果你運行是否包裹在SELECT查詢完全保護你的Postgres
query.exec_sql("SELECT * FROM (" + sql + ")")
是否在某些sql
可以運行任何東西,但SELECT
任何載體?
是否有任何其他方式暫時取消提升連接,以便它只能執行SELECT?
注意:它看起來像SET ROLE解決了這個問題,但我遇到的問題是我無法以簡單的方式創建角色。
如果sql
字符串來自第三方,那麼它可以用於SQL注入。我不確定這是否是你要求的,因爲對於56k點的用戶來說這太基本了。對不起,如果不是這樣的話。該字符串可能是:
some_table; insert into user_table (user_id, admin_privilege) values (1, true);
他說,假設它是一個單一的聲明。如果你的客戶正在準備查詢,我相信這在Postgres中是一個安全的假設。 –
它甚至可以是使用DELETE和RETURNING ....的子查詢。結果將是您從已刪除記錄中看到的最後一件事情:-( –
@FrankHeikens您是否測試過'select * from(從t中刪除*返回*) q'這是一個語法錯誤 –
雖然你可以把查詢修改數據的語句在CTEs嵌入INSERT
/UPDATE
/DELETE
報表,他們只允許在頂層,所以這不是一個問題。
然而,你可以調用一個函數,它可以包含任何東西。即使你在只讀事務中運行它,一個函數也可能會將其提升爲讀寫。
但是解決方案很簡單:如果您不想讓調用者執行某些操作,請不要授予他們執行此操作的權限。創建一個只有他們需要的GRANTs
的用戶,並且您可以按原樣執行sql
。
沒有定義權限的能力,你會得到最接近的可能是一個read-only transaction和/或查詢後明確回滾,但仍然會有不能插孔(例如你不能回撥setval()
)。
我明白這一點,我的問題是,它現在讓供應變得複雜,因爲現在我停滯了調配兩個賬戶。在一個事務中用一個回滾與上述結合在一起應該保證安全嗎? –
我猜這是因爲一個函數可能可能發出一個提交併開始一個新的交易... –
我不認爲你可以控制一個函數內的交易,但是你可以做得比這更糟......例如'pg_terminate_backen d()'調用將所有人踢出服務器,或者用'COPY'命令替換Postgres二進制文件... –
什麼是客戶端和驅動程序? –
您應該使用具有適當權限的用戶,並且不是這樣的「解決方法」。 – CBroe
@ClodoaldoNeto libpq –