Postgresql
使用返回集合的 sql 函式而不是安全屏障視圖是否安全?
從 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
.