本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
預存程序的安全和權限
本主題說明建立和執行預存程序所需的資料庫認證。
根據預設,所有使用者具有建立程序的權限。若要建立程序,您必須擁有預設授與語言 PL/PG SQL 的USAGE權限。PUBLIC根據預設,只有超級使用者和擁有者才有權限呼叫程序。如果超級使用者想要防止使用者建立預存程序,則可以從使用者REVOKEUSAGE在 PL/PG SQL 上執行。
若要呼叫程序,您必須獲得程序的EXECUTE權限。依預設,程序擁有者和超級使用者會授與新程序的EXECUTE權限。如需詳細資訊,請參閱GRANT。
根據預設,建立程序的使用者就是擁有者。依預設 CREATEDROP,擁有者對程序具有、和EXECUTE權限。超級使用者具備所有權限。
SECURITY屬性控制程序存取資料庫物件的權限。建立預存程序時,您可以將SECURITY屬性設定為DEFINER或INVOKER。如果您指定 SECURITYINVOKER,程序會使用叫用程序之使用者的權限。如果您指定 SECURITYDEFINER,程序會使用程序擁有者的權限。INVOKER為預設值。
由於SECURITYDEFINER程序是以擁有該程序之使用者的權限執行,因此您必須確定程序不會遭到濫用。為了確保SECURITYDEFINER程序不會被濫用,請執行以下操作:
授予EXECUTE程SECURITYDEFINER序給特定使用者,而不是授予PUBLIC。
以結構描述名稱來限定程序需要存取的所有資料庫物件。例如,使用
myschema.mytable
,而不只是mytable
。如果您無法依結構描述限定物件名稱,請在建立程序
search_path
時使用SET選項進行設定。設定search_path
來排除不受信任使用者所能撰寫的任何結構描述。此方法防止此程序的任何發起人建立物件 (例如,資料表或檢視),而遮罩應該由程序使用的物件。如需SET選項的更多資訊,請參閱CREATE PROCEDURE。
下列範例將 search_path
設為 admin
,以確保從 admin
結構描述存取 user_creds
資料表,而不是從 public 或發起人的 search_path
中任何其他結構描述來存取。
CREATE OR REPLACE PROCEDURE sp_get_credentials(userid int, o_creds OUT varchar) AS $$ BEGIN SELECT creds INTO o_creds FROM user_creds WHERE user_id = $1; END; $$ LANGUAGE plpgsql SECURITY DEFINER -- Set a secure search_path SET search_path = admin;