从 9.2 开始,可以使用该security_barrier
属性来防止恶意选择的函数和运算符访问“隐藏”在视图过滤器后面的数据(postgres 文档中的完整信息)。
您可以在下面的测试中看到这种情况的发生,但是在测试结束时使用 set-returning 函数而不是视图没有观察到相同的效果。
这只是这个单独测试的一个怪癖,还是设置返回函数总是一种安全的1方法来防止这种泄漏?
试验台:
create schema stack;
set search_path=stack;
create table t(secret) as values (1), (2);
测试1:
create view v as select * from t where secret^4>1;
select * from v;
/*
┌────────┐
│ secret │
├────────┤
│ 2 │
└────────┘
*/
create function f(integer) returns integer cost 1 language plpgsql as $$
begin
raise notice 'secret is: %',$1;
return $1;
end;
$$;
select * from v where f(secret)>0;
/*
NOTICE: secret is: 1 <-------- SECURITY LEAK
NOTICE: secret is: 2
┌────────┐
│ secret │
├────────┤
│ 2 │
└────────┘
*/
测试2:
create function fv() returns setof t language sql as $$
select * from t where secret^4>1
$$;
select * from fv() where f(secret)>0;
/*
NOTICE: secret is: 2 <-------- no leak
┌────────┐
│ secret │
├────────┤
│ 2 │
└────────┘
*/
清理:
drop schema stack cascade;
1出于性能原因,您可能不想走这条路线,即使它是安全的
是 -如果您使用非 . 语言的函数
SQL
,或者将它们定义为STRICT
.本质上,您必须防止函数内联。如果函数不是内联的,那么谓词就不能通过它向下推,也不能被展平。
只有 SQL 函数符合内联条件,并且只有在它们未定义为
STRICT
.