Size: a a a

pgsql – PostgreSQL

2020 June 20

W

Warstone in pgsql – PostgreSQL
SECURITY DEFINER. Дальше нагуглите.
источник

MC

Max Chistyakov in pgsql – PostgreSQL
Warstone
SECURITY DEFINER. Дальше нагуглите.
я и так указал security definer,  в коде что выше это видно
источник

2_

2flower _ in pgsql – PostgreSQL
Max Chistyakov
Всем привет. Вопрос по безопасности функций
Как обойти ограничение, что вызывающий юзер не может в функции селектить из таблицы, на которые у него нет прав? хотел обойтись без раздачи прав на саму таблицу, обернув вызов в функцию. выставив контекст security definer и дав права на эту функцию.

sudo -u postgres psql

create table public.test as select * from (values (cast(1 as int)), (2), (3)) as t(col1);

create or replace function public.fTest()
returns table (a int) external security definer
as $$
begin return query select a from public.test; end
$$
language plpgsql;

create role sql_reporting_services with login password '12345';
grant execute  on function public.fTest() to sql_reporting_services;

quit;

psql -h 127.0.0.1 -U sql_reporting_services -d car_app_portal

Результат:
select * from public.fTest();
ERROR:  permission denied for table test
CONTEXT:  SQL statement "select a from public.test"```
PL/pgSQL function ftest() line 2 at RETURN QUERY
Вариант SECURITY DEFINER (безопасность определившего) определяет, что функция выполняется с правами пользователя, создавшего её.
владелец функции права имет?
источник

MC

Max Chistyakov in pgsql – PostgreSQL
2flower _
Вариант SECURITY DEFINER (безопасность определившего) определяет, что функция выполняется с правами пользователя, создавшего её.
владелец функции права имет?
дал ему права на execute функции, но специально не дал на таблицу к которой она обращается.
Точно нужно давать права ещё и на таблицу?
источник

2_

2flower _ in pgsql – PostgreSQL
Max Chistyakov
дал ему права на execute функции, но специально не дал на таблицу к которой она обращается.
Точно нужно давать права ещё и на таблицу?
владелец-это кто СОЗДАЕТ, а вы говорите про того, кто запускает.
кто владелец функции? owner
источник

W

Warstone in pgsql – PostgreSQL
Эм... А почему вы считаете что создав в базе postgres таблицу и функцию, она так-же создастся в базе car_app_portal?
источник

2_

2flower _ in pgsql – PostgreSQL
Warstone
Эм... А почему вы считаете что создав в базе postgres таблицу и функцию, она так-же создастся в базе car_app_portal?
он не в postgres создает иначе бы ошибка была бы функция не найдена, а не с правами проблема.
источник

W

Warstone in pgsql – PostgreSQL
А я верю что он сначала такую-же создал в car_app_portal.
источник

MC

Max Chistyakov in pgsql – PostgreSQL
2flower _
Вариант SECURITY DEFINER (безопасность определившего) определяет, что функция выполняется с правами пользователя, создавшего её.
владелец функции права имет?
>владелец функции права имет?
а, понял вас. Владелец (postgres) права имеет и на селект из таблицы, и на селект из функции:
\connect car_app_portal 
select current_user;
current_user
--------------
postgres
(1 row)

postgres=# \connect car_app_portal
You are now connected to database "car_app_portal" as user "postgres".
car_app_portal=# select * from public.test ;
col1
------
   1
   2
   3
(3 rows)

car_app_portal=# select * from public.ftest() ;
a
---
 
 
 
(3 rows)
источник

W

Warstone in pgsql – PostgreSQL
\df ftest

Еще пожалста...
источник

MC

Max Chistyakov in pgsql – PostgreSQL
Странно, конечно, что он три пустых строки вернул из функции, но по крайней мере не ругнулся
источник

W

Warstone in pgsql – PostgreSQL
Или \d ftest
источник

2_

2flower _ in pgsql – PostgreSQL
еще раз КТО владелец функции.  я что то космическое спрашиваю?
источник

W

Warstone in pgsql – PostgreSQL
Да ))
источник

2_

2flower _ in pgsql – PostgreSQL
я так понимаю скоро за прочтение документации будут сжигать как еретиков.
источник

MC

Max Chistyakov in pgsql – PostgreSQL
Max Chistyakov
Всем привет. Вопрос по безопасности функций
Как обойти ограничение, что вызывающий юзер не может в функции селектить из таблицы, на которые у него нет прав? хотел обойтись без раздачи прав на саму таблицу, обернув вызов в функцию. выставив контекст security definer и дав права на эту функцию.

sudo -u postgres psql

create table public.test as select * from (values (cast(1 as int)), (2), (3)) as t(col1);

create or replace function public.fTest()
returns table (a int) external security definer
as $$
begin return query select a from public.test; end
$$
language plpgsql;

create role sql_reporting_services with login password '12345';
grant execute  on function public.fTest() to sql_reporting_services;

quit;

psql -h 127.0.0.1 -U sql_reporting_services -d car_app_portal

Результат:
select * from public.fTest();
ERROR:  permission denied for table test
CONTEXT:  SQL statement "select a from public.test"```
PL/pgSQL function ftest() line 2 at RETURN QUERY
2flower , учитывая что фукнция создана из под postgres, так понимаю  postgres  и владелец
источник

2_

2flower _ in pgsql – PostgreSQL
Max Chistyakov
2flower , учитывая что фукнция создана из под postgres, так понимаю  postgres  и владелец
я не телепат,это надо проверить.
источник

MC

Max Chistyakov in pgsql – PostgreSQL
Warstone
\df ftest

Еще пожалста...
\df ftest
                      List of functions
Schema | Name  | Result data type | Argument data types | Type
--------+-------+------------------+---------------------+------
public | ftest | TABLE(a integer) |                     | func
(1 row)
источник

W

Warstone in pgsql – PostgreSQL
Покажите вывод \d или \df от функции
источник

W

Warstone in pgsql – PostgreSQL
Значит \d ftest
источник