3

我正在開發一個使用Ruby on Rails的數據倉庫,我應該允許用戶在應用程序數據庫上執行任意的SELECT查詢。我知道這是你通常不應該做的,但它是我的客戶端實際需要的接口(我想不出用戶可能想要做的所有可能的查詢並將它們轉換爲ActiveRecord查詢)。可能有複雜的聯接和子查詢等。 我寧願這樣做(將其集成到我的應用程序),而不是讓他們通過pgAdmin訪問數據庫(我使用postgresql)。用戶生成的SQL查詢

我的問題是:做這件事最安全的方法是什麼?我應該能夠逃脫任何東西像插入,更新,刪除表等...

我想獲取查詢字符串和消毒這些「危險」的話,然後使用ActiveRecord :: Base.connection.execute (sanitized_sql_string)。 這是一個合理的方法嗎?

+1

說得對,讓用戶**鍵入**自己的SQL是危險的。你可以鎖定它們不能損壞你的數據庫的權利,但你不能讓它們不正確地連接表,這可能會產生一個失控的查詢**。 Andyne(sp?)曾經有一種叫做GQL(圖形查詢語言)的產品,它允許用戶點擊對象和線條以圖形方式創建查詢。它在幕後完成了** good ** SQL的工作。您可以採取類似的方法,以便用戶1)不必學習數據庫模型; 2)不必知道SQL即可構建臨時查詢。 –

+0

您可能會更喜歡商店購買的產品,如水晶報表或商業對象。實際上,帶有鏈接表的Microsoft Access並不是那麼糟糕。 –

+0

我不知道,我可能一個人在這裏,但我認爲如果做得對,允許即席查詢是完全正確的。這顯然是一個強大的工具,僅供某些知道SQL的用戶使用。一些蹩腳的編輯總是會有侷限性;我還沒有看到任何我覺得有用的東西。如果使用正確,Postgres中的安全性非常好,並且可以通過將查詢超時設置爲5秒或更長時間來避免*失控查詢*。請記住,[StackOverflow](http://data.stackexchange.com/)實際上允許即席查詢。 –

回答

3

最安全的方法是讓Postgres爲您處理這個安全問題。創建一個新用戶:

CREATE USER Reader; -- Your Rails app should logon with this user 

然後,明確授予你希望他們能夠查詢的對象SELECT權限:

GRANT INSERT ON TableFoo TO Reader; 
GRANT INSERT ON TableBar TO Reader; 

然後,他們將能夠運行任意SELECT來自這兩個表的查詢,但如果他們嘗試INSERT,他們將得到權限被拒絕。然後,您可以捕獲這些安全性異常並在您的UI中適當地處理它們。

+0

您需要對包含感興趣表格的模式授予'GRANT'權限。這毫無疑問是正確的方法。不管你是否可以說服Rails以不同用途登錄不同的用戶,完全是另一回事,儘管.. –

+0

我喜歡這種方法。事情是,我需要訪問具有不同連接的相同模型,所以最終我需要在非只讀環境中執行查詢(我使用查詢結果更新其他模型)。我想要做的是在保存未來實際使用前,使用只讀用戶驗證查詢。這聽起來合理嗎? – pcarranzav

1

創建應用程序,然後創建數據庫。

在此之後,在您的數據庫配置(database.yml)中,用一些非默認用戶(例如lame_user)連接到數據庫。在你的RDBMS上創建lame_user,在你的情況下PostgreSQL,並授予他對你所有表的SELECT權限。
您現在將擁有可以訪問您的數據庫的用戶postgreslame_user,但只有postgres可以完成所有工作。

如果用戶試圖做除SELECT之外的任何事情,則會發生錯誤。

恢復:使此應用程序約束數據庫的東西。它會更容易。