我对SQL Server安全性感到有些困惑
我们有登录和用户:test
我们有表格:dbo.tblSessionFilter
用户测试在此表上没有选择权限且没有删除权限(我测试了这个!!)
然后我们有程序:
create procedure dbo.procFilter_Clear with execute as caller
as
delete from dbo.tblSessionfilter
where spid = @@SPID
用户测试已执行此程序。
现在,用户测试可以调用此过程,可以从表中删除条目;虽然他没有对表格进行直接删除访问,但程序为execute as caller
!
怎么可能?
可能是因为过程和表在同一个模式中?
答案 0 :(得分:1)
请参阅Ownership Chains:
当多个数据库对象按顺序相互访问时,序列称为链。虽然这些链不是独立存在的,但当SQL Server遍历链中的链接时,SQL Server对组成对象的权限评估方式与单独访问对象时的权限不同。
和
当通过链访问对象时,SQL Server首先将对象的所有者与调用对象的所有者进行比较。这是链中的前一个链接。 如果两个对象具有相同的所有者,则不会评估所引用对象的权限。
(我的重点)