Я пытаюсь реализовать безопасность наших приложений (которые состоят в основном из веб-сайтов с использованием хранимых процедур SQL Server).Безопасность SQL Server - хранимые процедуры
Microsoft, похоже, считает, что наилучшей практикой является обертывание всех функций данных в хранимых процедурах, которые мы выполнили. Наша структура что-то вроде:
- SQL базы данных сервера -
[data1]
- базы данных SQL Server -
[webSPs]
- PHP/Symfony веб-приложения
Все данные хранятся в таблицах в [data1]
и на тот же сервер - это еще одна «база данных», которая содержит только хранимые процедуры, используемые веб-приложениями.
У SQL Server есть «webapp» для входа в систему, который, как пользователь на [webSPs]
, имеет разрешения только для запуска хранимых процедур в [webSPs]
.
Однако, поскольку эти хранимые процедуры чтения, записи, добавлять данные о [data1]
таблицах, этот пользователь должен быть членом db_datawriter
и db_datareader
ролей базы данных в [data1]
.
Это все работает нормально, но похоже, что здесь есть дыра в безопасности, поскольку тогда пользователь может получить доступ к [webSPs]
, чтобы не только запускать хранимые процедуры, но и записывать в любую базовую таблицу - можно ли разрешить что сказать что-то вроде:
you can read/write to tables on this database but only through SPs - not directly
Из того, что я прочитал, я думаю, что это будет работать, как я надеялся, что, если бы не была вторая база данных, которую я предполагаю, что нарушает право собственности цепочки.
Заранее спасибо.
Какова была мотивация размещения хранимых процедур * в другой * базе данных? Это, кажется, делает вещи излишне сложными, чем они должны быть .... –
Пользователь не должен быть членом db_datawrite для записи данных из хранимой процедуры. Если у них есть разрешение на выполнение процедуры, они смогут записывать данные.Так что да, чтобы ответить на ваш вопрос, вы не позволяете этому пользователю писать непосредственно в таблицы, но дать им разрешение на выполнение процедур. –
Шон, где таблицы находятся в другой базе данных, если пользователь не имеет явных прав на чтение и запись данных, он возвращает ошибку: «Разрешение SELECT отклонено ...» Я думаю, это связано с тем, что SP находятся в другой базе данных (согласно комментариям Марка выше) Просто интересно, есть ли способ обойти это, поскольку я хотел бы сохранить разделение, если это возможно. – PJM