SQL Server有很多很好用的小功能,但是有时候这些功能反过来给你制造麻烦。其中一个这样的问题是别名用户的使用。本技巧教你如何在数据库中建立别名用户时找到安全漏洞,不过在SQL Server 2008种不推荐这个功能。 首先,你可以对每个数据库运行下面的简单查询或者针对所有数据库操作它来运行以便找到带有“dbo”访问权限的用户。 SELECT DISTINCT DB_NAME() DATABASE_NAME, SU.NAME DATABASE_USERNAME FROM SYSUSERS SU JOIN SYSMEMBERS SM ON SM.MEMBERUID = SU.UID INNER JOIN SYSMEMBERS SM1 ON SM.MEMBERUID = SM1.MEMBERUID INNER JOIN SYSUSERS SU1 ON SM1.GROUPUID = SU1.UID AND SU1.NAME = 'db_owner' AND SU.NAME <> 'dbo' 但是,此查询可能不能找到所有具有“dbo”访问权限的用户,因为SQL Server 中的一个安全漏洞。让我来解释这个问题。 让我们创建两个登录,AliasUser1和DBUser1. 别名AliasUser1分配给“dbo”角色。 把用户DBUser1添加到角色“dbo”中,如果我们需要把“dbo”权限授给一个数据库用户,那么这是一种很正常的行为。 下面的脚本将为我们做这些动作: IF NOT EXISTS (SELECT * FROM SYS.SERVER_PRINCIPALS WHERE NAME = N'AliasUser1‘) CREATE LOGIN [AliasUser1] WITH PASSWORD=N'test', DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF GO IF NOT EXISTS (SELECT * FROM SYS.SERVER_PRINCIPALS WHERE NAME = N'DBUser1’) CREATE LOGIN [DBUser1] WITH PASSWORD=N'test', DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF GO --add a aliased user with dbo priveleges exec sp_addalias 'AliasUser1','dbo' --add a regular db user to the dbo role CREATE USER [DBUser1] FOR LOGIN [DBUser1] 现在,让我们从SSMS中检验我们刚创建的用户。注意,我们别名到“dbo”中的“AliasUser1”没有在用户下面出现。SQL Server没有在“用户”列表中显示别名用户。
那么我们要如何找到一个数据库中的别名用户呢?执行下面的查询:
下面的命令也能运行来显示所有的用户和别名。在下面的输出结果中,你可以看到别名用户“AliasUser1”没有作为一个用户出现,但是在第二个结果集中它作为一个别名用户出现。
另一个需要注意的有趣之处是,你不能使用sp_dropuser存储过程来删除一个别名用户,相反,要使用sp_dropalias来删除。 |