EXECUTE AS USER和EXECUTE AS LOGIN有什么区别,使第二个用户行为异常?


10

最近,我一直在使用EXECUTE AS LOGIN来检查某个人是否可以在我们的数据库之一中使用表函数。测试表明他可以,但他一再报告失败。

该人使用登录名“ WEB”连接到数据库,并且该数据库中的用户“ WEB”与登录名“ WEB”相关联,因此我尝试了以下脚本:

-- part 1
EXECUTE AS USER = 'WEB'
GO
SELECT 
    USER_NAME() AS 'user_name'
    ,SUSER_NAME() AS 'suser_name'
    ,SUSER_SNAME() AS 'suser_sname'
    ,SYSTEM_USER AS 'system_user'
GO
REVERT
GO

-- part 2
EXECUTE AS LOGIN = 'WEB'
GO
SELECT 
    USER_NAME() AS 'user_name'
    ,SUSER_NAME() AS 'suser_name'
    ,SUSER_SNAME() AS 'suser_sname'
    ,SYSTEM_USER AS 'system_user'
GO
REVERT
GO

第一部分很好,其结果是:

网站| 网站| 网站| 网页

但是第二个结果有点令人困惑:

dbo | 网站| 网站| 网页

EXECUTE AS USER和EXECUTE AS LOGIN有什么区别,使第二个失败?此外,当然,第一个是数据库级别,第二个是服务器级别的模拟,这是我所了解的,在此不做说明。


第二个并不是“失败”,它只是告诉您登录名已分配了服务器角色(sysadmin)。您是否检查了用户所请求的架构?在dbo默认架构不是开发人员期望的默认架构之前。可以通过完全引用表格更好地修复代码
Stuart Moore

Answers:


7

即使sysadmin组成员在数据库中具有显式用户,也始终会映射到dbo。因此,看起来登录名WEB是的成员sysadmin,因此在第二种情况下USER_NAME()正确返回dbo


检查并确认。它确实是sysadmin的成员。事实证明,此报告已到达其他开发人员之一,他只是分配了登录sysadmin角色,而不是正确的解决方案。我什至都不会考虑这种情况,我真的很失望。他回来时,我们将进行认真的谈话。今天学到一些新东西,谢谢。
gemisigo 2012年

这也意味着您的应用程序(报告?)对sysadmin成员具有模拟权限。查看授予权限层次结构的精确程度。即使现在,如果可能的话,该报告也仍然可以模拟其他sysadmin成员,因此该报告应用程序实际上是系统管理员。就是 作为一种可能的特权提升攻击媒介,它可以被黑客使用,或者更有可能由您的员工使用。
Remus Rusanu

如果报表应用程序具有IMPERSONATE权限,WEB并且WEB已从中删除,sysadmin则该门将关闭。但是仍然值得检查。
雷木斯·鲁萨努

是的,我们将不得不再次检查所有影响权利的内容,以查看是否还有其他问题已通过这种方式“解决”。现在不是很幸福的权利:(再次感谢,莱姆斯。
gemisigo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.