2016-06-13 50 views
1

我需要爲他人創建一個Postgres用戶來查詢我的數據庫,但由於它是敏感數據,他們不能讓他們看到列的值,他們應該只能看到計數。然而,他們需要能夠確定where語句的許多不同可能的排列組合。有沒有辦法做到這一點?只允許COUNT來Postgres角色?

+0

做這些'WHERE'子句需要引用敏感列嗎? –

+0

不幸的是,否則我知道我只能訪問不敏感的列。 – Ben

回答

0

我認爲唯一足夠靈活的處理這種情況將是SECURITY DEFINER function。基本上,這些函數中的查詢的行爲就好像它們是由函數的所有者運行的,而不是函數的調用者,允許調用者執行他們通常不會(以受控方式)許可的事情。

當然,你需要小心你在那裏運行什麼,你需要格外包含任何用戶輸入您的查詢,這將會使事情變得困難,如果你希望來電者指定當偏執他們自己的WHERE條款。用戶定義的函數可能沒有問題,因爲像WHERE my_func(private_col)這樣的約束可以簡單地將其輸入寫入某個表中。但是,如果呼叫者設法偷偷摸摸地對自己的=運營商定義,那麼和WHERE private_col = 1一樣無害的事情可能同樣糟糕;編寫這樣的函數時一定要lock down your search path

所有這一切,即使你有一個完美的解決方案,這個設置可能不像看起來那麼安全。您可能沒有直接暴露這些值,但是您仍然會暴露有關這些值的信息,並且在幾次查詢過程中,這足以重建值本身。例如:

SELECT COUNT(*) FROM private_data WHERE creditcard >= '00000000' AND creditcard < '50000000'; 
SELECT COUNT(*) FROM private_data WHERE creditcard >= '25000000' AND creditcard < '50000000'; 
SELECT COUNT(*) FROM private_data WHERE creditcard >= '25000000' AND creditcard < '37500000'; 
... 

這只是需要54個步驟才能收斂到一個單一的數字。即使是100個字符的字符串,通常也只需要幾百個查詢就可以查詢。