Я работаю над продуктом, на котором работает SQL-сервер, который позволяет некоторым приложениям входить в систему, и их учетным записям предоставляется разрешение на запуск хранимой процедуры - И НИЧЕГО. Хранимая процедура принадлежит администратору; хранимая процедура принимает запрос и выполняет его, затем результаты возвращаются приложению.
К сожалению, я не могу понять, почему приложение может вызывать хранимую процедуру, к которой ему предоставлен доступ, но хранимая процедура не может выполнить оператор SQL, который был передан в нее.
Хранимая процедура выполняет переданный запрос, когда я вошел в систему как администратор, но когда я вошел в систему как пользователь с ограниченными правами, он вызывает исключение в операторе execute.
Например:
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 не являются безопасными, и они наносят ущерб цели хранимых процедур, но я не знаю, как зашифровать запросы SQL, которые передаются через ODBC и работают с SQL Server до 2005 года.
В любом случае я пытался установить некоторые минимальные меры безопасности, чтобы хотя бы обеспечить базовую защиту.