【问题标题】:User Granted Access to Stored Procedure but Can't Run Query用户授予对存储过程的访问权限但无法运行查询
【发布时间】:2010-10-05 18:04:43
【问题描述】:

我正在开发一种运行 SQL 服务器的产品,该服务器允许某些应用程序登录,并且他们的登录名被授予运行存储过程的权限 - 而不是其他的。存储过程归管理员所有;存储过程接受一个查询并执行它,然后将结果返回给应用程序。

不幸的是,我无法弄清楚为什么应用程序可以调用它被授予访问权限的存储过程,但存储过程却无法执行传递给它的 SQL 语句。

当我以管理员身份登录时,存储过程会执行传入的查询,但是当我以受限用户身份登录时,它会在执行语句中引发异常。

例如:

EXEC [Admin].[STORED_PROC] @SQL_STATEMENT = 'SELECT * FROM table_x'

STORED_PROC 看起来像这样:

BEGIN TRY
   EXEC (@SQL_STATEMENT)
END TRY
BEGIN CATCH
   -- some logging when an exception is caught, and the exception is caught here!!!
END CATCH

try catch 语句中没有任何内容,除了 EXEC... 和 SQL_STATEMENT 在我以管理员身份登录时有效,但在我以用户身份登录时无效。

谁能帮我弄清楚我需要设置哪些权限才能允许用户仅通过存储的过程运行查询?


所以有一些关于允许通过存储过程执行原始 SQL 语句的 cmets 违背了使用存储过程的目的......但实际上我们正在做的是将加密的 SQL 语句传递到存储过程和存储过程将语句解密,然后执行它。

所以是的,实际上原始 SQL 语句并不安全,它们破坏了存储过程的目的,但我不知道如何加密通过 ODBC 传递并针对 2005 年之前的 SQL Server 运行的 SQL 查询。

无论如何,我试图设置一些最低限度的保护措施,以至少具有一些基本的安全性。

【问题讨论】:

    标签: sql sql-server stored-procedures database-permissions grant


    【解决方案1】:

    用户还需要对表进行 SELECT 授权

    【讨论】:

      【解决方案2】:

      由于您使用的是动态 sql,SQL server 无法判断您正在使用哪些表,因此您还必须授予所有表的 SELECT 权限

      【讨论】:

        【解决方案3】:

        允许将原始 SQL 传递到存储过程中然后执行是数据不安全的本质。

        SQL Server 安全性的结构使得 SQL 的任意位在它们自己的安全上下文中执行。如果您没有运行临时查询的权限,您也没有通过存储过程运行它的权限。在这方面,SQL Server 将您从自己手中拯救出来。

        【讨论】:

          【解决方案4】:

          由于您的系统允许访问存储的 proc 而没有其他权限(这对安全性有好处,不应更改),那么您在任何情况下都不能使用动态 SQL,因为权限不在表级别,而您的 dbas 是不太可能改变这一点。这不仅是为了防止 SQL 注入攻击,而且是为了防止可能的内部欺诈,因此任何认为这很重要的工作场所都不会为了让您的生活更轻松而做出妥协。您只需要重新设计就不会动态地做任何事情。你别无选择。如果您首先编写 proc 来执行您希望它执行的操作,则无需发送加密的 sql。

          【讨论】:

            【解决方案5】:

            当在 SP 内通过EXECsp_executesql 使用动态 SQL 时,SP 上的EXEC 权限不允许您在动态 sql 中运行任意代码。您要么需要授予 SELECT(糟糕),要么可以使用 EXECUTE ASSETUSER 冒充其他用户。

            当使用普通 SQL 时,EXEC 权限工作正常,覆盖未授予的SELECT 权限。不过,如果你有DENY,我相信它胜过它。

            话虽如此,但当 SQL 的来源 SP(或数据库之外)时,我仍然不确定您是否应该使用EXECUTE AS。对于不受外界影响的代码生成或动态 sql,EXECUTE AS 可能是一个有用的工具

            【讨论】:

              【解决方案6】:

              这很可能是因为不同的架构,即登录的用户不是管理员架构的一部分,或者至少我希望不是。

              允许您希望实现的访问类型的安全技术,即允许访问由同一架构拥有的对象,称为所有权链接。

              这个原则在帖子中没有得到最好的解释。

              这是来自 Microsoft 的链接,用于解释该概念。

              http://msdn.microsoft.com/en-us/library/ms188676(SQL.90).aspx

              这是一篇关于安全性的优秀文章,其中提供了所有权链接等技术的示例和演练。

              http://www.sommarskog.se/grantperm.html

              我希望这很清楚并对您有所帮助,但请随时提出更多问题。

              干杯,约翰

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-10-24
                • 1970-01-01
                • 2016-05-20
                相关资源
                最近更新 更多