Postgresql

使用返回集合的 sql 函式而不是安全屏障視圖是否安全?

  • June 25, 2018

從 9.2 開始,可以使用該security_barrier屬性來防止惡意選擇的函式和操作員訪問視圖中“隱藏”在過濾器後面的數據(postgres 文件中的完整資訊)。

您可以在下面的測試中看到這種情況,但是使用 set-returning 函式而不是測試結束時的視圖沒有觀察到相同的效果。

這只是這個單獨測試的一個怪癖,還是 set-returning 函式總是一種安全的方法來防止這種洩漏?

試驗台:

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.

引用自:https://dba.stackexchange.com/questions/84680