powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Безопастность на уровне базы данных
17 сообщений из 17, страница 1 из 1
Безопастность на уровне базы данных
    #36225130
blest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица контрагентов. Нужно, чтобы каждый созданный контрагент мог создавать своих контрагентов. Реализовать хочу 2-мя таблицами: 1 таблица контрагентов(со своими полями и ограничениями уникальности) и 2-я таблица иерархической структуры:
Код: plaintext
 Id   PId   CId
- Инкремент, айдишник родительского контрагента и айдишник его заведеного контрагента. Думаю это правильно.
Заполняться таблицы будут из клиентского приложения, и вывод будет делаться туда же. Вопрос в безопастности на уровне базы данных.
Контрагент будет заходить в программу под своим логином/паролем. Соответственно как сделать, чтобы ни каким ошибочным запросом этот контрагент не смог увидеть не своих созданных контрагентов? Как это можно сделать (логином в базу/схемой или чем-нибудь еще) ?
...
Рейтинг: 0 / 0
Безопастность на уровне базы данных
    #36225845
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делайте доступ только через ХП. И наступит счастье.
Иначе от прямых запросов не защититься.
Можно попробовать вместо ХП применить вьюху, в кот. есть типа функция-фильтр по "вычислению" прав.
Но ХП лучше, хотя геморнее.
...
Рейтинг: 0 / 0
Безопастность на уровне базы данных
    #36225946
Фотография shelsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blest Реализовать хочу ...
Простой вопрос о дублях в такой схеме
1) А что будет если есть некая организация ООО "Рога и копыта" которую завел и Контрагент1 и Контрагент2 ? Организация то одна а заведена дважды ?
2) Или конрагент2 является Контрагентом1
....
Вот тут ваши две таблицы не катят И по всей видимости без кросс-таблиц связи вам не обойтись. Что-то типа <контрагент> => <доступные_контрагенты> => <все_конрагенты>
...
Рейтинг: 0 / 0
Безопастность на уровне базы данных
    #36226090
blest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shelsoftblest Реализовать хочу ...
Простой вопрос о дублях в такой схеме
1) А что будет если есть некая организация ООО "Рога и копыта" которую завел и Контрагент1 и Контрагент2 ? Организация то одна а заведена дважды ?
2) Или конрагент2 является Контрагентом1
....
Вот тут ваши две таблицы не катят И по всей видимости без кросс-таблиц связи вам не обойтись. Что-то типа <контрагент> => <доступные_контрагенты> => <все_конрагенты>

Ну да, как раз об этом щас и думаю. =)
В вашем варианте можете рассказать, что такое доступные_контрагенты?
...
Рейтинг: 0 / 0
Безопастность на уровне базы данных
    #36228483
12345678
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.youtube.com/watch?v=OkzoBY2FZmo&NR=1
...
Рейтинг: 0 / 0
Безопастность на уровне базы данных
    #36230962
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
shelsoft
Простой вопрос о дублях в такой схеме
1) А что будет если есть некая организация ООО "Рога и копыта" которую завел и Контрагент1 и Контрагент2 ? Организация то одна а заведена дважды ?

Очень сложный вопрос

Убей двойника

/topic/10671&pg=1&hl=%f3%e1%e5%e9+%e4%e2%ee%e9%ed%e8%ea%e0
...
Рейтинг: 0 / 0
Безопастность на уровне базы данных
    #36232010
Денис Ильин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на уровне хранимых процедур нужно защиту делать.
это, скажем так, гораздо лучше расширяется.
да и с вставками будет проблем меньше, например: можно запретить вводить названия, у которых в рамках одного слова встречаются буквы из разных алфавитов и т.п... пытаться искать уже существующие названия с изменённой капитализацией и т.д., и т.п., как это сделать чисто на вьюхах не понятно, да и наверное, не нужно.
...
Рейтинг: 0 / 0
Безопастность на уровне базы данных
    #36233397
blest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Денис Ильинна уровне хранимых процедур нужно защиту делать.
это, скажем так, гораздо лучше расширяется.
да и с вставками будет проблем меньше, например: можно запретить вводить названия, у которых в рамках одного слова встречаются буквы из разных алфавитов и т.п... пытаться искать уже существующие названия с изменённой капитализацией и т.д., и т.п., как это сделать чисто на вьюхах не понятно, да и наверное, не нужно.

Так, а на уровне хранимых процедур вы имеете ввиду для каждого пользователя создавать свою хранимку и в ней делать нужны выборки/фильтры ну и всякие дополнительные проверки?
...
Рейтинг: 0 / 0
Безопастность на уровне базы данных
    #36233777
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blestТак, а на уровне хранимых процедур вы имеете ввиду для каждого пользователя создавать свою хранимку и в ней делать нужны выборки/фильтры ну и всякие дополнительные проверки?Озверели?!
...
Рейтинг: 0 / 0
Безопастность на уровне базы данных
    #36233906
blest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_LblestТак, а на уровне хранимых процедур вы имеете ввиду для каждого пользователя создавать свою хранимку и в ней делать нужны выборки/фильтры ну и всякие дополнительные проверки?Озверели?!

Так я ж и прошу объяснить..
...
Рейтинг: 0 / 0
Безопастность на уровне базы данных
    #36233949
Денис Ильин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
человек начал думать в правильном направлении, но немножко не додумал.
хранимая процедура, скажем, будет одна. будут даны пользователю права на её исполнение.
скажем, эта процедура будет возвращать.. ну скажем, она будет возвращать всех подчинённых пользователя.
в момент исполнения хранимой процедуры id пользователя, который её вызвал - известен.
далее есть несколько способов, самый тупой и лобовой - это написать большой оператор switch / case. не лобовой - обратиться к таблице подчинения с headID = (id нашего пользователя)
в общем идея такая - нужные данные (и только те, к которым имеет право доступа!) пользователь получает благодаря своему волшебному userID.
в sql server этот id можно получить с помощью функции suser_id(), аналогичные штуковины есть и на (всех?..) остальных СУБД.

как то так.
...
Рейтинг: 0 / 0
Безопастность на уровне базы данных
    #36233955
Денис Ильин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. комбинируем 2 аутентификации:
1) имеет ли право пользователь вообще исполнять такую хранимую процедуру? это встроенный в сервер метод
2) гибкий метод (самопальный), основанный на знании userID. можно гибко давать практически любые права, детализация идёт вплоть до отдельных записей ( первый способ аутентификации такую возможность не даёт)
...
Рейтинг: 0 / 0
Безопастность на уровне базы данных
    #36236514
blest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Денис Ильинчеловек начал думать в правильном направлении, но немножко не додумал.
хранимая процедура, скажем, будет одна. будут даны пользователю права на её исполнение.
скажем, эта процедура будет возвращать.. ну скажем, она будет возвращать всех подчинённых пользователя.
в момент исполнения хранимой процедуры id пользователя, который её вызвал - известен.
далее есть несколько способов, самый тупой и лобовой - это написать большой оператор switch / case. не лобовой - обратиться к таблице подчинения с headID = (id нашего пользователя)
в общем идея такая - нужные данные (и только те, к которым имеет право доступа!) пользователь получает благодаря своему волшебному userID.
в sql server этот id можно получить с помощью функции suser_id(), аналогичные штуковины есть и на (всех?..) остальных СУБД.

как то так.

Про айдишник пользователя понятно. Тогда я насколько понял в основной таблице нужно создавать дополнительное поле, куда записывать этот userID пользователя создавшего строку? чтобы потом юзер имел возможность обратиться к тем строкам, которые он создал и уже в таблице подчиненя назначать различные права на его созданные строки, так?
...
Рейтинг: 0 / 0
Безопастность на уровне базы данных
    #36237992
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blestПро айдишник пользователя понятно. Тогда я насколько понял в основной таблице нужно создавать дополнительное поле, куда записывать этот userID пользователя создавшего строку? чтобы потом юзер имел возможность обратиться к тем строкам, которые он создал и уже в таблице подчиненя назначать различные права на его созданные строки, так?Если уж Вы хотите "застолбить" отдельные строки в таблице за разными пользователями, то владение надо как-то обозначить. А как это сделаете - дело личное и зависит в том числе от СУБД. Заведите таблицу пользователей БД, а в таблице данных хранить их userID.

Общее, пожалуй одно: исполняемая ХП должна иметь полный доступ к целевой таблице, пользователь должен иметь права на исполнение ХП, но не имеет права на SELECT из таблицы. ХП выступает в качестве "черного ящика", которая фильтрует выходной рекордсет. Например, в MSSQL это опция EXECUTE AS, в FB - гранты на SELECT для ХП. Как-то так.
...
Рейтинг: 0 / 0
Безопастность на уровне базы данных
    #36238109
Фотография shelsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Убей двойника
К моменту "убивания" записи как ключивые могут быть уже обвехованы договорами, сотрудниками и прочей ... ерундой. Читаю вашу ссылку вспоминаю что "есть хирурги, а есть терапевты у которых само неужное отваливается" ))) Отдельная тема как заводить объект в базу дабы не было дубликатов

Senya_L...
Еще раз настаиваю на своем подходе преиведенном выше. А именно использовании ACL-кросстаблицы связи с полями типа ID_USER и ID_CONTRAGENT. Хранение ID_USER в данных исключает возможность дать доступ на строку таблицы нескольким пользователям.

Для автора топика что такое ACL тоже найдете в вики


______________________________________________________
Давайте считать обступившее нас со всех строн коричневое море шоколадным
...
Рейтинг: 0 / 0
Безопастность на уровне базы данных
    #36238127
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shelsoftSenya_L...
Еще раз настаиваю на своем подходе преиведенном выше. А именно использовании ACL-кросстаблицы связи с полями типа ID_USER и ID_CONTRAGENT. Хранение ID_USER в данных исключает возможность дать доступ на строку таблицы нескольким пользователям. Я не против. Так оно, конечно, правильнее, но и сложнее. Если автора не пугают трудности и он решит использовать более сложные схемы - дам еще такой тынц .
...
Рейтинг: 0 / 0
Безопастность на уровне базы данных
    #36238128
Денис Ильин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как это сделаете - дело личное и зависит в том числе от СУБД. Заведите таблицу пользователей БД, а в таблице данных хранить их userID.

можно в таблице с данными, на которые требуются права, скажем, хранить эти права в виде битовой маски, при чём не для отдельных пользователей, а сразу для групп пользователей.
вполне себе кросс-RDBMS решение.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Безопастность на уровне базы данных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]