存储过程的安全性和权限
本主题介绍创建和运行存储过程所需的数据库凭证。
默认情况下,所有用户都有权创建过程。要创建过程,您必须具有语言 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
。如果您无法通过 schema 限定其名称,请在创建过程时使用 SET 选项来设置
search_path
。设置search_path
以排除任何可由不可信用户写入的 schema。此方法防止该过程的任何调用方创建对象(例如,表或视图)来屏蔽过程所要使用的对象。有关 SET 选项的更多信息,请参阅 CREATE PROCEDURE。
以下示例将 search_path
设置为 admin
以确保从 user_creds
schema 访问 admin
表,而不是从调用方的 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;