我正在开发一种运行 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 查询。
无论如何,我尝试设置一些最低限度的保护措施,以至少具有一些基本的安全性。