【问题标题】:Permissions when using "Execute sp_Executesql"使用“执行 sp_Executesql”时的权限
【发布时间】:2011-04-18 12:11:00
【问题描述】:

我有一个数据库,其中所有访问都由存储过程控制。 DBA 希望避免让用户直接读/写访问基础表,我可以理解。因此,所有数据的更新和选择都是通过存储过程完成的。基本上,他创建了一个角色,该角色对数据库中的所有存储过程具有 EXECUTE 权限,并赋予用户该角色。

问题是其中一个存储过程动态构建了一个 SQl Query 并通过“Execute sp_Executesql”执行它。无需详细说明,查询是动态构建的,因为它会根据许多用户输入参数而发生显着变化。有问题的存储过程只是一个 SELECT sql 语句,但是我发现仅授予存储过程 EXECUTE 权限是不够的。存储过程中引用的使用“Execute sp_Executesql”的基础表需要被授予“datareader”访问权限,否则存储过程将失败。

关于如何纠正这个问题的任何想法?我真的想限制对表的访问仅限于存储过程,但我需要找到一种方法来解决使用“Execute sp_Executesq”l 的存储过程。谢谢。

【问题讨论】:

  • 你可能会得到更好的 avdice serverfault。我的建议 - 与 dba 交谈并解释情况。与他们合作以获得正确的权限。

标签: sql sql-server permissions dynamic-sql sp-executesql


【解决方案1】:

真正的问题是 sp_Executesql 在主数据库中,不一定是您工作的数据库。您的 DBA 必须授予调用过程执行 sp_Executesql 的权限。比任何有权调用该过程的人都能够运行 sp_Executesql。

【讨论】:

  • -1 sp_Executesql 已公开执行。 “需要成为公共角色的成员。” msdn.microsoft.com/en-us/library/ms188001.aspx 真正的问题是使用 sp_executesql 时所有权链接中断,请参阅stackoverflow.com/questions/3815411
  • 如果您已加固数据库以锁定公共角色,那么@MAW74656 是正确的;例如,您创建了一个自定义角色来替换公共角色并从公共中删除所有权限。是的,这违反了书面要求,但是像 AppDetective(通过 SQL Server STIG)这样的数据库强化扫描系统将公共角色及其默认的开放访问视为主要风险。
  • ...此外,引用同一篇 MSDN 文章“运行时编译的 Transact-SQL 语句可能使应用程序遭受恶意攻击”。这比“要求成为公共角色的成员”声明更显眼。
【解决方案2】:

在包装过程中,您可以使用EXECUTE AS OWNEREXECUTE AS SomeuserWithNoLogin

这将在包含 sp_executesql 的存储过程期间更改登录上下文。

  • 如果您使用 OWNER,它会起作用,因为您已经在使用所有权链接。
  • 如果您的 DBA(好人!)不希望您以 dbo 身份运行,则设置一个具有完全读取权限但没有权限的用户。 EXECUTE AS <user> 需要一个条目是 sys.database_principals

像这样:

CREATE USER SomeuserWithNoLogin WITH WITHOUT LOGIN
EXEC sp_addrolemember 'db_datareader', 'SomeuserWithNoLogin'

有关详细信息,请参阅EXECUTE AS Clause on MSDNCREATE PROCEDURE

【讨论】:

猜你喜欢
  • 2012-08-28
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
  • 2017-12-18
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多