本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
預存程序的安全和權限
本主題說明建立和執行預存程序所需的資料庫登入資料。
根據預設,所有使用者具有建立程序的權限。若要建立程序,您必須有 PL/pgSQL 語言的 USAGE 權限,此權限預設會授予 PUBLIC。根據預設,只有超級使用者和擁有者才有權限呼叫程序。如果超級使用者想要防止使用者建立預存程序,他們可以在 PL/pgSQL 上對使用者執行 REVOKE USAGE。
若要呼叫程序,您必須獲授予程序的 EXECUTE 權限。根據預設,新程序的 EXECUTE 權限會授予程序擁有者和超級使用者。如需詳細資訊,請參閱GRANT。
根據預設,建立程序的使用者就是擁有者。根據預設,擁有者具有程序的 CREATE、DROP 和 EXECUTE 權限。超級使用者具備所有權限。
SECURITY 屬性控制程序對資料物件的存取權限。當您建立預存程序時,您可以將 SECURITY 屬性設為 DEFINER 或 INVOKER。如果您指定 SECURITY INVOKER,程序會使用程序叫用使用者的權限。如果您指定 SECURITY DEFINER,程序會使用程序擁有者的權限。INVOKER 為預設值。
因為 SECURITY DEFINER 程序是以擁有使用者的權限執行,請務必確保不能誤用程序。若要確保不能誤用 SECURITY DEFINER 程序,請執行下列動作:
將 SECURITY DEFINER 程序的 EXECUTE 授予特定使用者,而非 PUBLIC。
以結構描述名稱來限定程序需要存取的所有資料庫物件。例如,使用
myschema.mytable
,而不只是mytable
。如果您無法以結構描述來限定物件名稱,請在建立程序時使用 SET 選項來設定
search_path
。設定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;