PG 文档提供了这个带有 search_path 的正确编写的安全定义器函数示例:
CREATE FUNCTION check_password(uname TEXT, pass TEXT)
RETURNS BOOLEAN AS $$
DECLARE passed BOOLEAN;
BEGIN
SELECT (pwd = $2) INTO passed
FROM pwds
WHERE username = $1;
RETURN passed;
END;
$$ LANGUAGE plpgsql
SECURITY DEFINER
-- Set a secure search_path: trusted schema(s), then 'pg_temp'.
SET search_path = admin, pg_temp;
我不明白这部分:
但是如果没有 SET 子句,或者 SET 子句仅提及 admin,则可以通过创建名为 pwds 的临时表来破坏该功能。
如果admin.pwds
存在且search_path
设置为admin
only,怎么可能pwds
恶意创建临时表 , ?
如果
pg_temp
根本不存在search_path
,则总是首先搜索临时方案,即就好像它被隐式地添加到search_path
.防止它首先被搜索的唯一方法是在
search_path
.