допуск к хранимой процедуре на SQL

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

допуск к хранимой процедуре на SQL

Сообщение sergey-911 » 19.04.2007 (Чт) 1:15

Доброго времени суток уважаемые.
Возможно буду не прав, задавая вопрос в этом форуме...
Написал клиентское приложение на VB6 для работы с БД на SQL. Сравниваю в программе роли, к которым есть доступ у пользователя при помощи хранимой процедуры

Код: Выделить всё

CREATE PROCEDURE [sp_Role]   --Проверка на обладание роли

@role   [nvarchar](50)

AS

IF IS_MEMBER (@role)       = 1    OR   IS_MEMBER ('db_owner')   = 1   SELECT   1   AS   Role
IF IS_MEMBER (@role)       = 0    AND   IS_MEMBER ('db_owner')   = 0   SELECT   0   AS   Role
GO


В зависимости от этих ролей формируется интерфейс у пользователя.
Теперь пишу другое аналогичное приложение.

НО, хочу проверять не наличие роли, а доступ к самим хранимым процедурам и представлениям. Не знаю, как реализовать? Буду очень признателен за помощь.
С уважением, Сергей.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.04.2007 (Чт) 7:36

Обращаешься к процедуре. Если ошибка, значит доступа нет.
Lasciate ogni speranza, voi ch'entrate.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 19.04.2007 (Чт) 19:32

Не Алибек. Это не айз. Чтобы сформировать интерфейс одного окна, нужно будет запустить все хранимые процедуры, проверить их выполнение, передавая какие-либо параметры и потом формировать пользовательские кнопки, в зависимости от выдаваемых ошибок. Это будет очень долго...
Есть ещё варианты?
С уважением, Сергей.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 19.04.2007 (Чт) 21:17

Application Role - роль под которой работает приложение имеет полный доступ, а доступ конкретного юзера определяется самим приложением. Причем доступ в данном случае дается не на процедуры/таблички/вьюшки и поля а на меню, отчеты и т.д.

P.S Сам так работаю...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Grover
Новичок
Новичок
 
Сообщения: 47
Зарегистрирован: 29.03.2007 (Чт) 7:46

Сообщение Grover » 19.04.2007 (Чт) 22:14

Согласенс с Andrey Fedorov

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 20.04.2007 (Пт) 0:49

Не Андрей.
Не согласен. Пользователи вносят изменения в БД только через хранимые процудуры, просматривают данные только через представления (вьюхи).
Раньше я делал несколько ролей, каждая из которых имеет определённый набор допусков к этим объектов.
Я проверял эти роли процедурой, указанной выше, запуская
Код: Выделить всё
EXEC sp_Role Application

Соответственно, возвращается 1, если есть у пользователя доступ к этой роли (Application), 0 - если нет. В зависимости от этого формировался интерфейс проги.
Бывают случаи, что конкретному пользователю нужно дать доступ к ещё одной фенички. Следовательно нужно менять экзешник, вводя для этого пользователя ещё одну роль. А это - не айз.
Поэтому, хочу сделать привязку не к ролям, а к хранимым процедурам и вьюхам непосредственно.
На MSSQL сервере это должна осуществлять встроенная хранимая процедура sp_helprotect, на сколько я правильно понял из одной книги, но не могу понять как? Дома она срабатывает, на работе, запуская её получаю ошибку... Да и возвращает она не пойми что...
Код: Выделить всё
EXEC sp_helprotect 'sp_login'

В общем, зарылся я... Одна надежда, на Вас уважаемые...:)
С уважением, Сергей.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 20.04.2007 (Пт) 4:08

Бу-га-га.

Теперь без глума и детально.

Ну, если тебе настолько важно предоставлять персональный интерфейс юзеру, то можешь развлечься парсингом результатов sp_helprotect, почему бы и нет. Кстати, вывод у нее довольно однозначный и хорошо документированный:
Код: Выделить всё
exec sp_helprotect 'MyTable', 'MyUser'

вернет все права пользователя MyUser (либо роли, смотря что это) на объект MyTable.

Впрочем, есть пара проблем:
1. Если права у тебя раздаются не персонально юзерам, а все-таки (я надеюсь) посредством включения юзеров в роли, то ты попал, потому как право, наследуемое через роль, не отображается в выводе sp_helprotect при запросе по имени пользователя. Следовательно, тебе на каждый чих придется сначала получать список всех ролей, явным или неявным членом которых является пользователь - включая членство ролей в других ролях! - и потом либо для каждой этой роли вызывать процедуру, либо вызывать ее один раз без указания имени роли и уже на клиенте разбирать полученный недетский рекордсет на предмет пересечения двух множеств. Можно написать эту процедуру целиком на T-SQL, но это тоже не будет решением проблемы, почему - смотрим дальше.
2. Если юзер включен в несколько ролей, одна из которых дает ему селект на таблицу, а другая запрещает ему это, то запрет имеет приоритет. Причем неважно, на каком уровне что дается. Это тебе тоже придется проверять ручками, и тут ты реально попадаешь, если решишь с этим связаться.

Учитывая все вышесказанное, смысл использования sp_helprotect становится крайне сомнительным. Более того, в сиквеле есть функция PERMISSIONS(), которая возвращает как раз сумму всех действующих прав - то, что тебе требуется. Правда, только для того пользователя, который ее запустил - но тебе ведь ничего другого и не нужно, как я понял. Впрочем, и с ней есть, опять-таки, пара проблем:

1. Она возвращает битовую маску в формате 32-битного целого, причем для каждого столбца будут дополнительные данные (права на SELECT / UPDATE из таблиц и представлений можно задавать с точностью до столбца). Не самое сложное в этой жизни, особенно по сравнению со следующим пунктом.
2. В BOL 2005 эта функция объявлена - lo and behold! - устаревшей. Рекомендуется больше не писать код с ее использованием, а все имеющиеся упоминания переделать на новую системную функцию fn_my_permissions. Это значит, что тебе придется писать разные версии кода под разные версии MS SQL Server. И если сейчас ты еще можешь все сделать на Permissions(), и это даже будет работать как на 2000, так и на 2005 сиквеле, то выход Katmai может стать для тебя маленькой белой лисичкой.

Помимо всего вышесказанного, в MSSQL 2005 появился такой тонкий момент, как Metadata Visibility Restrictions. Если вкратце, то клиент А может в общем случае не увидеть права клиента В. В твоем случае это не представляет особой проблемы, но в каких-нить мелочах, тем не менее, можешь налететь.



Ну как, ты все еще горишь желанием рисовать персональные формочки под набор прав в базе?..

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 20.04.2007 (Пт) 5:47

sergey-911 писал(а):Следовательно нужно менять экзешник, вводя для этого пользователя ещё одну роль. А это - не айз.


Конечно не айз. Ибо у тебя просто в корне неверное представление о построении приложений с использованием Application Role...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 20.04.2007 (Пт) 6:52

Спасибо Ennor
Код: Выделить всё
PERMISSIONS()
поюзаю на работе.
Юзерам права раздаются посредством включения юзеров в роли, частично меняя права для каждого...
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 20.04.2007 (Пт) 23:29

Спасибо Ennor, и всем, кто мне помогал.
Получилась сдедующая хранимая процедура
Код: Выделить всё

CREATE PROCEDURE [sp_Access]         --Проверка доступа к объекту

@object   [nvarchar](50)

AS

IF PERMISSIONS (OBJECT_ID(@object)) =   0 SELECT 0 AS Access
IF PERMISSIONS (OBJECT_ID(@object)) <> 0 SELECT 1 AS Access
GO

Конечно не айз. Ибо у тебя просто в корне неверное представление о построении приложений с использованием Application Role...

Не согласен Андрей. Объясни пожалуйста почему.
Application Role - роль под которой работает приложение имеет полный доступ, а доступ конкретного юзера определяется самим приложением. Причем доступ в данном случае дается не на процедуры/таблички/вьюшки и поля а на меню, отчеты и т.д.

Раньше я также работал. Сейчас я доступ раздаю на самом сервере посредством ролей. Теперь же, для того, чтобы, к примеру разрешить юзеру, работающему в какой-либо группе редактировать записи, достаточно дать ему доступ к этой процедуре. Кнопка "Редактировать", в программе, сама станет активной. Можешь справедливо заметить, что у тебя всё это делается в самой программе, без MS SQL сервера. Чтож возможно. Зато за безопасность данных отвечает сам сервер. На мой взгляд, так надёжнее и удобнее. Переубеди меня Андрей, и я вернусь к прежнему механизму предоставления прав доступа.
С уважением, Сергей.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 21.04.2007 (Сб) 1:22

sergey-911 писал(а):Теперь же, для того, чтобы, к примеру разрешить юзеру, работающему в какой-либо группе редактировать записи, достаточно дать ему доступ к этой процедуре.


А то что даже в одной таблице юзер может редактировать/видеть только определенные записи или поля - тоже сервер определяет? То что юзер может видеть только определенные отчеты, хотя имеет доступ на редактирование ко всем их таблицам - тоже сервер? Задавая права доступа для роли мне что удобней - указать объект программы (форму, отчет, пункт меню) или десяток-другой таблиц/процедур на которой все это основано? IMHO - мне однозначно удобней сказать что юзеры данной роли могут работать с такими-то документами, а с такими-то нет, чем перечислять доступ к набору процедур для этой работы (тем более когда все документы хранятся в одной таблице) - если под каждый каприз создавать специальную процедуру, то их кол-во растет неимоверно...

А надежность... Код доступа в программе по возможности зашифрован, еxe-шник и компоненты программа проверяет на целостность - во избежании какой-либо модификации нехорошими дядями...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.04.2007 (Сб) 1:26

... а потом логин и пароль на SQL Server передаётся как обычно, а обычно он передаётся по сети плейнтекстом...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 21.04.2007 (Сб) 1:38

GSerg писал(а):... а потом логин и пароль на SQL Server передаётся как обычно, а обычно он передаётся по сети плейнтекстом...


Хм. Дайте мне логин и пароль любого варианта доступа - и базе не поздоровится. Ибо если юзер может модифицировать таблицу, то она будет модифицирована и мной (я же имею его права), независимо от того работаю я через Application Role или нет. А через процедуру или запрос - да какая мне разница - неужто мне процедуру трудно вызвать, если у меня на нее есть права? Смешно - неужто это считаете защитой?
Последний раз редактировалось Andrey Fedorov 21.04.2007 (Сб) 1:48, всего редактировалось 1 раз.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.04.2007 (Сб) 1:43

Если через процедуру, можно полностью снять все права доступа к таблицам. И тогда юзер не может модифицировать таблицу. И только с процедурами работать может...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 21.04.2007 (Сб) 2:00

GSerg писал(а):Если через процедуру, можно полностью снять все права доступа к таблицам. И тогда юзер не может модифицировать таблицу. И только с процедурами работать может...


Но он ведь может смотреть/модифицировать таблицы через процедуры - ему же надо работать. Значит то же смогу и я. Причем гораздо быстрей его ибо не стеснен программой - скажем, пройтись по табличке в цикле меняя нужные мне значения... Больше мне ничего и не надо...

Знание логина/пароля юзера имеющего права на модификацию данных дает очень многое... Ну посуди сам - тебе большая разница как смотреть/менять табличку - через запрос или процедуру? Уверен что сможешь в любом варианте.

Так что "защита через процедуры" - защищает лишь от вредителя открывающего табличку посредством линковки в Access - если он ничего другого и не умеет... Думаешь данный чел имеет квалификацию(+оборудование, конечно) достаточную для перехвата пароля в локальной сети?

И случае с Application Role - если есть много ReadOnly юзеров и хочется дополнительно подстраховаться - можно сделать для них отдельную роль с правами "только на чтение" нужных таблиц. Так что и тут никакой разницы...
Последний раз редактировалось Andrey Fedorov 21.04.2007 (Сб) 2:15, всего редактировалось 1 раз.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.04.2007 (Сб) 2:14

Нормальная хранимка не допустит неправильного изменения данных.
А насчёт каждого допустимого изменения что-то запишет куда-то. Кто это был и почему.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 21.04.2007 (Сб) 2:20

GSerg писал(а):Нормальная хранимка не допустит неправильного изменения данных.
А насчёт каждого допустимого изменения что-то запишет куда-то. Кто это был и почему.


То же самое при необходимости делается и триггером. Разницы тут никакой. Хранимки, кстати, можно применять в любом варианте доступа - одно другому совершенно не мешает...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 21.04.2007 (Сб) 2:44

Сколько сообщений...:)
Похоже, спор перешёл в филосовский...
В моём случае, у пользователей вообще нет доступа к таблицам. Только к вьюхам есть, и то, только на чтение. Все, без исключения изменения БД производятся из хранимых процедур. Возможно, я неправ.
Спасибо за помощь и отзывчивость.
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 21.04.2007 (Сб) 2:47

Andrey Fedorov
Хранимки, кстати, можно применять в любом варианте доступа - одно другому совершенно не мешает...

Что ты имеешь ввиду? Насколько я себе представляю, если нет доступа на сервере к хранимой процедуре, то она не запустится!
С уважением, Сергей.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 21.04.2007 (Сб) 3:10

sergey-911 писал(а):Что ты имеешь ввиду? Насколько я себе представляю, если нет доступа на сервере к хранимой процедуре, то она не запустится!


Ну просто GSerg выше выдал версию что злобный вредитель узнал логин/пароль юзера перехватив сетевые пакеты... :lol:

А я ответил, что и хранимки в таком случае не помогают - через них все так же лекго модифицируется как и через таблицы. И понеслось...
:lol:
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 99

    TopList