Управление разрешениями с использованием хранимых процедур в SQL ServerManaging Permissions with Stored Procedures in SQL Server

Одним из методов создания нескольких линий защиты для базы данных является реализация доступа ко всем данным с помощью хранимых процедур или определяемых пользователем функций.One method of creating multiple lines of defense around your database is to implement all data access using stored procedures or user-defined functions. Отменяются или запрещаются разрешения на все базовые объекты (например, таблицы), на хранимые процедуры предоставляются разрешения EXECUTE.You revoke or deny all permissions to underlying objects, such as tables, and grant EXECUTE permissions on stored procedures. Тем самым создается эффективный периметр безопасности вокруг данных и объектов базы данных.This effectively creates a security perimeter around your data and database objects.

Преимущества хранимых процедурStored Procedure Benefits

Хранимые процедуры обладают следующими преимуществами.Stored procedures have the following benefits:

  • Логику данных и бизнес-правила можно инкапсулировать, чтобы пользователи получали доступ к данным и объектам только тем путем, который предусмотрен разработчиками и администраторами баз данных.Data logic and business rules can be encapsulated so that users can access data and objects only in ways that developers and database administrators intend.

  • Чтобы исключить возможность атак путем внедрения кода SQL, можно использовать параметризованные хранимые процедуры, проверяющие ввод пользователя.Parameterized stored procedures that validate all user input can be used to thwart SQL injection attacks. При использовании динамического SQL обязательно параметризуйте команды и ни в коем случае не включайте значения параметров непосредственно в строку запроса.If you use dynamic SQL, be sure to parameterize your commands, and never include parameter values directly into a query string.

  • Можно запретить нерегламентированные запросы и изменение данных.Ad hoc queries and data modifications can be disallowed. Таким образом пользователи не смогут злонамеренно или случайно уничтожить данные или выполнить запросы, снижающие производительность сервера в сети.This prevents users from maliciously or inadvertently destroying data or executing queries that impair performance on the server or the network.

  • В коде процедур можно обрабатывать ошибки, не передавая их в клиентские приложения.Errors can be handled in procedure code without being passed directly to client applications. Таким образом предотвращается возвращение сообщений об ошибках, которые могут использоваться в атаках зондированием.This prevents error messages from being returned that could aid in a probing attack. Регистрируйте ошибки и обрабатывайте их на сервере.Log errors and handle them on the server.

  • К написанным однажды хранимым процедурам могут обращаться многие приложения.Stored procedures can be written once, and accessed by many applications.

  • Клиентским приложениям не требуются сведения о базовых структурах данных.Client applications do not need to know anything about the underlying data structures. Код хранимых процедур можно изменять, не внося изменения в клиентские приложения, если это не влияет на списки параметров и возвращаемые типы данных.Stored procedure code can be changed without requiring changes in client applications as long as the changes do not affect parameter lists or returned data types.

  • Хранимые процедуры снижают нагрузку на сетевой трафик, объединяя несколько операций в одном вызове процедуры.Stored procedures can reduce network traffic by combining multiple operations into one procedure call.

Выполнение хранимых процедурStored Procedure Execution

Хранимые процедуры предоставляют доступ к данным с помощью цепочек владения таким образом, чтобы пользователям не требовались явные разрешения для работы с объектами базы данных.Stored procedures take advantage of ownership chaining to provide access to data so that users do not need to have explicit permission to access database objects. Цепочка владения возникает, когда объекты, последовательно получающие доступ друг к другу, принадлежат одному пользователю.An ownership chain exists when objects that access each other sequentially are owned by the same user. Например, хранимая процедура может вызывать другие хранимые процедуры или обращаться к нескольким таблицам.For example, a stored procedure can call other stored procedures, or a stored procedure can access multiple tables. Если все объекты в цепочке владения принадлежат одному владельцу, то SQL Server проверяет только разрешение EXECUTE вызывающего, но не разрешения вызывающего на другие объекты.If all objects in the chain of execution have the same owner, then SQL Server only checks the EXECUTE permission for the caller, not the caller's permissions on other objects. Поэтому нужно предоставить только разрешения EXECUTE на хранимые процедуры и отменить или запретить все разрешения на базовые таблицы.Therefore you need to grant only EXECUTE permissions on stored procedures; you can revoke or deny all permissions on the underlying tables.

Советы и рекомендацииBest Practices

Простого написания хранимой процедуры недостаточно для надежной защиты приложения.Simply writing stored procedures isn't enough to adequately secure your application. Необходимо учитывать следующие потенциальные уязвимости защиты.You should also consider the following potential security holes.

  • Предоставьте разрешения EXECUTE на хранимые процедуры нужным ролям базы данных для доступа к данным.Grant EXECUTE permissions on the stored procedures for database roles you want to be able to access the data.

  • Отмените или запретите все разрешения на базовые таблицы для всех ролей и пользователей базы данных, в том числе роль public.Revoke or deny all permissions to the underlying tables for all roles and users in the database, including the public role. Все пользователи наследуют разрешения из роли public.All users inherit permissions from public. Поэтому запрет разрешений для роли public означает, что доступ будут иметь только владельцы объектов и члены роли sysadmin, все остальные пользователи не смогут наследовать разрешения, будучи членами других ролей.Therefore denying permissions to public means that only owners and sysadmin members have access; all other users will be unable to inherit permissions from membership in other roles.

  • Не добавляйте пользователей или роли к ролям sysadmin и db_owner.Do not add users or roles to the sysadmin or db_owner roles. Системные администраторы и владельцы базы данных имеют доступ ко всем объектам базы данных.System administrators and database owners can access all database objects.

  • Отключите учетную запись guest.Disable the guest account. Это будет препятствовать соединению анонимных пользователей с базой данных.This will prevent anonymous users from connecting to the database. В новых базах данных учетная запись guest отключена по умолчанию.The guest account is disabled by default in new databases.

  • Реализуйте обработку ошибок и ошибочных записей журнала.Implement error handling and log errors.

  • Создайте параметризованные хранимые процедуры, которые будут проверять ввод пользователей.Create parameterized stored procedures that validate all user input. Считайте все входные данные пользователей не соответствующими требованиям безопасности.Treat all user input as untrusted.

  • Избегайте использования динамического SQL за исключением абсолютно необходимых случаев.Avoid dynamic SQL unless absolutely necessary. Используйте функцию Transact-SQL QUOTENAME() для разделения строковых значений и избегайте любого вхождения разделителей в строке ввода.Use the Transact-SQL QUOTENAME() function to delimit a string value and escape any occurrence of the delimiter in the input string.

Внешние ресурсыExternal Resources

Дополнительные сведения см. в следующих ресурсах.For more information, see the following resources.

ResourceResource ОписаниеDescription
Хранимые процедуры и Внедрение кода SQL в электронной документации на SQL ServerStored Procedures and SQL Injection in SQL Server Books Online Разделы описывают, как создавать хранимые процедуры и как работает внедрение кода SQL.Topics describe how to create stored procedures and how SQL Injection works.

См. такжеSee also