1

我正在开发一种运行 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 语句的评论违背了使用存储过程的目的......但实际上我们实际上正在做的是将加密的 SQL 语句传递到存储过程中并且存储的过程将语句解密,然后执行它。

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

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

4

6 回答 6

6

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

于 2009-02-05T18:19:55.910 回答
4

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

于 2009-02-05T18:17:55.023 回答
4

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

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

于 2009-02-05T18:22:40.303 回答
0

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

于 2009-02-05T19:03:05.793 回答
0

当通过SPEXECsp_executesql在 SP 内使用动态 SQL 时,SPEXEC上的权限不允许您在动态 sql 中运行任意代码。您要么需要授予SELECT(yuck),要么您可以使用EXECUTE AS或冒充另一个用户SETUSER

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

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

于 2009-02-05T19:06:28.187 回答
0

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

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

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

这是来自 Microsoft 的链接,它解释了这个概念。

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

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

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

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

干杯,约翰

于 2009-02-05T20:47:15.037 回答