视图越权问题

【 使用环境 】测试环境
【 OB or 其他组件 】OB
【 使用版本 】4.3.1
【问题描述】
用root用户创建一张表tab并创建一个视图v_tab,创建一个用户user1,只给user1对视图v_tab的INSERT权限,不给user1对表tab的INSERT权限,user1依然可以对视图v_tab成功插入数据,在基表tab中可以查到user1通过视图v_tab插入的数据。
查看了代码未检查用户对视图引用的基表的操作权限,请问这样做的目的是什么?

【复现路径】

root用户:
use test;
create table tab(c1 int, c2 int);
create view v_tab as select * from tab;
create user user1;
grant insert on test.v_tab to user1;

user1用户:
insert into test.v_tab values(1,1);  -- 成功

root用户:
select * from tab; 
+------+------+
| c1   | c2   |
+------+------+
|    1 |    1 |
+------+------+
1 row in set (0.012 sec)
1 个赞

是ob的社区版mysql模式么?

1 个赞

是的

root用户应该有所有的对象的权限吧 能查看应该没有问题吧

这里的问题是:
user1没有表tab上的INSERT权限,但是,user1通过向视图v_tab中插入数据成功,导致user1将数据插入到了表tab中。

视图是个虚拟表 视图是基于基表创建的 实际的dml操作其实就是对基表操作的 在其他的数据库中也应该是一样的

如果视图引用了5个基表,其中,有4个基表user1有权限插入数据,有1个基表user1没有权限插入,这时,user1可以通过视图向那个没有插入权限的表中来插入数据了,这样就越权了
mysql中,在创建视图时,可以指定在执行期间是使用视图的创建者的权限还是调用者的权限,这样就防止了越权。
我想了解下我们ob这边在实现时,没有验证用户对基表的操作权限的原因是什么?

应该是和mysql保持一致 如果对基表没有插入权限 这样的操作 就是越权了 你最新的版本测试吧 应该是已知问题 我看你用的是431 你用OLAPob435或者OLTPob425 这两个版本都是LTS版本

4351也有这个问题

好的 我们内部也测试一下 看看

楼上我回答的有问题 不还意思 重新和内部的同学确认了 和mysql保持一致 我们也测试了 mysql也是这样 兼容mysql

mysql中,在创建视图时,可以使用SQL SECURITY指定在执行期间是使用视图的创建者的权限还是调用者的权限:

root:
create table tab2(c1 int, c2 int);
create SQL SECURITY INVOKER view v_tab2 as select * from tab2; -- 指定INVOKER,执行期间使用调用者的权限
create user user1;
grant insert on test.v_tab2 to user1;

user1:
mysql> insert into test.v_tab2 values(1,1); -- 失败
ERROR 1356 (HY000): View 'test.v_tab2' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them

root:
grant insert on test.tab2 to user1;

user1:
mysql> insert into test.v_tab2 values(1,1); -- 成功
Query OK, 1 row affected (0.00 sec)
1 个赞

目前ob支持create SQL SECURITY INVOKER view这个语法 但是没有实际的功能

1 个赞

好的,谢谢您

通过create view v_tab3 as select * from tab3;这种方式创建视图,在向视图插入数据时,
mysql需要用户有视图上的INSERT权限,同时,还需要视图的创建者要有基表上的INSERT权限,
ob只需要用户有视图上的INSERT权限:

root:
create table tab3(c1 int, c2 int);
create user user1;
create user user2;
grant create view on test.* to user2;
grant select on test.tab3 to user2;


user2:
create view v_tab3 as select * from tab3;


root:
grant insert on test.v_tab3 to user1;


user1:
insert into test.v_tab3 values(1,1); -- mysql失败,ob成功
mysql报错:ERROR 1356 (HY000): View 'test.v_tab3' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them


以下在mysql中执行:
root:
grant insert on test.tab3 to user2; -- 给视图的创建者授权基表tab3上的INSERT权限

user1:
insert into test.v_tab3 values(1,1); -- 成功

grant insert on test.v_tab to user1;user1对test.v_tab有insert权限,那不就自然对构成v_tab这个视图的表有insert权限了,如果没有对应的权限那这个权限赋予的意义不就没有了

mysql是哪个版本

8.0.42

找其他的同学问一下 看看是否符合预期 后面有结果了 会同步给你

好的,谢谢您