用户可以在未经许可的情况下更改程序

Lum*_*mpy 3 permissions sql-server-2008-r2

我有一个 sql server 用户,我们的应用程序正在以该用户身份连接。用户已被授予 db_datareader 和 db_datawriter 以及对其需要使用的每个存储过程的 Grant Execute。

这些是我在登录时查看用户映射以及在数据库下查看用户时看到的权限。

鉴于这些权限,我认为用户不应该能够更改程序;但是,当我的开发人员以该用户身份登录时,他们能够更新存储过程。

我对这些权限允许的内容有误解吗?有什么地方可以查找有关可能未显示在 UI 中的权限的信息吗?或者我是否需要明确拒绝更改该用户的存储过程?

Aar*_*and 5

您是否看到已授予的任何内容或不应该存在的角色成员资格?

EXECUTE AS USER = N'your user';
GO
SELECT * FROM sys.fn_my_permissions(NULL, NULL);
GO
REVERT;
GO

SELECT * FROM sys.database_permissions
WHERE grantee_principal_id = USER_ID(N'your user');
GO

SELECT r.name
FROM sys.database_role_members AS m
INNER JOIN sys.database_principals AS p
ON m.member_principal_id = p.principal_id
INNER JOIN sys.database_principals AS r
ON m.role_principal_id = r.principal_id
WHERE p.name = N'your user';

SELECT r.name
FROM sys.server_role_members AS m
INNER JOIN sys.server_principals AS p
ON m.member_principal_id = p.principal_id
INNER JOIN sys.server_principals AS r
ON m.role_principal_id = r.principal_id
WHERE p.name = N'your login';
Run Code Online (Sandbox Code Playgroud)

这些开发人员可能在db_owner您不知情的情况下担任该角色,或者已获得ALLdbo或其他架构的授权。

确保在正确的数据库中执行这些语句,并验证您的用户是否以他们所说的登录身份登录。也许他们有 sa 密码而您不知道。最后,您应该确保数据库主体映射到正确的服务器级登录。

SELECT dp.name, sp.name
FROM sys.database_principals AS dp
FULL OUTER JOIN sys.server_principals AS sp
ON dp.sid = sp.sid
WHERE 
(
  dp.type <> 'R' 
  OR sp.type NOT IN ('C', 'K')
)
ORDER BY 
  dp.name COLLATE DATABASE_DEFAULT + sp.name COLLATE DATABASE_DEFAULT DESC;
Run Code Online (Sandbox Code Playgroud)