一部のアプリケーションがログインできるようにする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
EXEC を除いて、try catch ステートメント内には何もありません。SQL_STATEMENT は、管理者としてログインしている場合は機能しますが、ユーザーとしてログインしている場合は機能しません。
ユーザーがストアド プロシージャのみを介してクエリを実行できるようにするために設定する必要があるアクセス許可を特定するのを手伝ってくれる人はいますか?
そのため、ストアド プロシージャを介して生の SQL ステートメントを実行できるようにすることについて、いくつかのコメントがありました。ストアド プロシージャを使用する目的を無効にします...しかし、実際には、暗号化された SQL ステートメントをストアド プロシージャに渡しています。ストアド プロシージャはステートメントを復号化し、それを実行します。
そうです、実際には生の SQL ステートメントは安全ではなく、ストアド プロシージャの目的を無効にしますが、ODBC を介して渡され、2005 年より前の SQL Server に対して実行される SQL クエリを暗号化する方法がわかりません。
いずれにせよ、少なくとも基本的なセキュリティを確保するために、最低限の安全策を講じようとしました。