SQL SERVER权限控制参数TrustWorthy

前几天碰到一个问题,使用普通登陆抓取所有登录信息,环境如下:

账号Collect_user拥有数据库Collect的执行权限

Collect库上有个存储过程usp_collect_login_information

create proc usp_collect_login_information as

select * from sys.syslogins(nolock)

那么当使用Collect_user执行时只能得到sa和collect_user的信息,我又不想给Collect_user过大的权限,当时想到了使用存储过程中的with execute as owner方法,结果只在其中的一台服务器上能够执行,在其他的服务器上还是返回一条记录,后来发现原来必须设置数据库Collect的trustwothy属性为on,Alter database Collect trustworthy on,这样当我再使用Collect_user执行这个存储过程就会得到所有登录信息了。

虽然问题解决了,但是问题也接着来了.

尽管Collecct_user在其他数据库上没有用户,但是只要存储过程里加了with execute as owner,那么他就可以在存储过程里查询任意其他数据库的数据,并且执行过查询的数据库,他就更改存储过程,执行其他例如create table,drop table等操作,例如

create proc usp_trustworthy_test1

with execute as owner

as

select * from mydb1.Table1

go

create proc usp_trustworthy_test2

with execute as owner

as

drop table mydb1.table1

go

execute as login='Collect_user'

exec usp_trustworthy_test1

exec usp_trustworthy_test2

你会发现尽管collect_user在mydb1上都没有用户,但是依然可以成功执行两个存储过程

mydb1.table1也会被删除



结论就是如果你使用了trustworthy参数,那么必须严格审核带有execute as owner的存储过程,否则将给数据库带来严重风险

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值