2014-07-24 69 views
3

給出一個客戶端庫,只能在一個批處理執行一個說法,如果你運行是否包裹在SELECT查詢完全保護你的Postgres

query.exec_sql("SELECT * FROM (" + sql + ")") 

是否在某些sql可以運行任何東西,但SELECT任何載體?

是否有任何其他方式暫時取消提升連接,以便它只能執行SELECT?

注意:它看起來像SET ROLE解決了這個問題,但我遇到的問題是我無法以簡單的方式創建角色。

+0

什麼是客戶端和驅動程序? –

+0

您應該使用具有適當權限的用戶,並且不是這樣的「解決方法」。 – CBroe

+0

@ClodoaldoNeto libpq –

回答

0

如果sql字符串來自第三方,那麼它可以用於SQL注入。我不確定這是否是你要求的,因爲對於56k點的用戶來說這太基本了。對不起,如果不是這樣的話。該字符串可能是:

some_table; insert into user_table (user_id, admin_privilege) values (1, true); 
+0

他說,假設它是一個單一的聲明。如果你的客戶正在準備查詢,我相信這在Postgres中是一個安全的假設。 –

+0

它甚至可以是使用DELETE和RETURNING ....的子查詢。結果將是您從已刪除記錄中看到的最後一件事情:-( –

+0

@FrankHeikens您是否測試過'select * from(從t中刪除*返回*) q'這是一個語法錯誤 –

1

雖然你可以把查詢修改數據的語句在CTEs嵌入INSERT/UPDATE/DELETE報表,他們只允許在頂層,所以這不是一個問題。

然而,你可以調用一個函數,它可以包含任何東西。即使你在只讀事務中運行它,一個函數也可能會將其提升爲讀寫。

但是解決方案很簡單:如果您不想讓調用者執行某些操作,請不要授予他們執行此操作的權限。創建一個只有他們需要的GRANTs的用戶,並且您可以按原樣執行sql

沒有定義權限的能力,你會得到最接近的可能是一個read-only transaction和/或查詢後明確回滾,但仍然會有不能插孔(例如你不能回撥setval())。

+0

我明白這一點,我的問題是,它現在讓供應變得複雜,因爲現在我停滯了調配兩個賬戶。在一個事務中用一個回滾與上述結合在一起應該保證安全嗎? –

+0

我猜這是因爲一個函數可能可能發出一個提交併開始一個新的交易... –

+0

我不認爲你可以控制一個函數內的交易,但是你可以做得比這更糟......例如'pg_terminate_backen d()'調用將所有人踢出服務器,或者用'COPY'命令替換Postgres二進制文件... –

相關問題