【问题标题】:Database role can access the table through stored procedure for which it has no access数据库角色可以通过它无权访问的存储过程访问表
【发布时间】:2020-06-14 13:42:46
【问题描述】:

我创建了一个数据库级角色:NonBillingRole。

CREATE ROLE NonBillingRole

然后通过以下命令授予它所有访问权限并撤销/拒绝对帐单表的访问权限:

REVOKE SELECT, INSERT, UPDATE, DELETE ON TblBilling TO NonBillingRole
DENY SELECT, INSERT, UPDATE, DELETE ON TblBilling TO NonBillingRole

然后我已经为这个角色添加了一个用户。

如果我直接尝试选择或修改表 TblBilling,这可以正常工作。 但是用户可以通过任何存储过程来选择和修改表。

我的目标是创建一个角色,该角色具有对数据库的所有访问权限,包括执行存储过程,但对表 TblBilling 没有直接或间接访问权限(即使通过存储过程)。

【问题讨论】:

  • 在存储过程和其他模块中使用对象时,如果对象具有相同的所有者(所有权链),则不会检查间接引用的对象的权限。这意味着您应该仅将存储过程的执行权限授予授权用户/角色。您可以分配不同的所有者(例如ALTER AUTHORIZATION ON OJBECT::TblBilling TO BillingOwner)来中断链,但这需要将 TblBilling 表的直接权限授予授权用户。
  • 在您的示例中添加无需使用DENY,因为该角色没有任何授予的拒绝权限。

标签: sql-server roles sqlroleprovider


【解决方案1】:

拒绝高于允许 - 但程序可以具有模拟能力,或以所有者身份运行,这可以绕过您的意图。

当您为表添加对角色的访问权限时,以及 DENY 将设置一些更高级别的访问约束,但它也可能导致视图、存储过程和函数的问题。我很少使用 DENY,因为它会导致获取数据时出现看不见的问题。

确保您拥有的用户仅为公共用户,并为您希望他们对您打算让他们使用的对象拥有的访问权限设置一个角色。如果应用程序控制访问,您将很难限制数据库中的访问,而不会对应用程序产生影响。

【讨论】:

    猜你喜欢
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多