|
|
|
Безопастность на уровне базы данных
|
|||
|---|---|---|---|
|
#18+
Есть таблица контрагентов. Нужно, чтобы каждый созданный контрагент мог создавать своих контрагентов. Реализовать хочу 2-мя таблицами: 1 таблица контрагентов(со своими полями и ограничениями уникальности) и 2-я таблица иерархической структуры: Код: plaintext Заполняться таблицы будут из клиентского приложения, и вывод будет делаться туда же. Вопрос в безопастности на уровне базы данных. Контрагент будет заходить в программу под своим логином/паролем. Соответственно как сделать, чтобы ни каким ошибочным запросом этот контрагент не смог увидеть не своих созданных контрагентов? Как это можно сделать (логином в базу/схемой или чем-нибудь еще) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2009, 14:14 |
|
||
|
Безопастность на уровне базы данных
|
|||
|---|---|---|---|
|
#18+
Делайте доступ только через ХП. И наступит счастье. Иначе от прямых запросов не защититься. Можно попробовать вместо ХП применить вьюху, в кот. есть типа функция-фильтр по "вычислению" прав. Но ХП лучше, хотя геморнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2009, 17:40 |
|
||
|
Безопастность на уровне базы данных
|
|||
|---|---|---|---|
|
#18+
blest Реализовать хочу ... Простой вопрос о дублях в такой схеме 1) А что будет если есть некая организация ООО "Рога и копыта" которую завел и Контрагент1 и Контрагент2 ? Организация то одна а заведена дважды ? 2) Или конрагент2 является Контрагентом1 .... Вот тут ваши две таблицы не катят И по всей видимости без кросс-таблиц связи вам не обойтись. Что-то типа <контрагент> => <доступные_контрагенты> => <все_конрагенты> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2009, 18:01 |
|
||
|
Безопастность на уровне базы данных
|
|||
|---|---|---|---|
|
#18+
shelsoftblest Реализовать хочу ... Простой вопрос о дублях в такой схеме 1) А что будет если есть некая организация ООО "Рога и копыта" которую завел и Контрагент1 и Контрагент2 ? Организация то одна а заведена дважды ? 2) Или конрагент2 является Контрагентом1 .... Вот тут ваши две таблицы не катят И по всей видимости без кросс-таблиц связи вам не обойтись. Что-то типа <контрагент> => <доступные_контрагенты> => <все_конрагенты> Ну да, как раз об этом щас и думаю. =) В вашем варианте можете рассказать, что такое доступные_контрагенты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2009, 19:00 |
|
||
|
Безопастность на уровне базы данных
|
|||
|---|---|---|---|
|
#18+
http://www.youtube.com/watch?v=OkzoBY2FZmo&NR=1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2009, 22:36 |
|
||
|
Безопастность на уровне базы данных
|
|||
|---|---|---|---|
|
#18+
shelsoft Простой вопрос о дублях в такой схеме 1) А что будет если есть некая организация ООО "Рога и копыта" которую завел и Контрагент1 и Контрагент2 ? Организация то одна а заведена дважды ? Очень сложный вопрос Убей двойника /topic/10671&pg=1&hl=%f3%e1%e5%e9+%e4%e2%ee%e9%ed%e8%ea%e0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2009, 19:42 |
|
||
|
Безопастность на уровне базы данных
|
|||
|---|---|---|---|
|
#18+
на уровне хранимых процедур нужно защиту делать. это, скажем так, гораздо лучше расширяется. да и с вставками будет проблем меньше, например: можно запретить вводить названия, у которых в рамках одного слова встречаются буквы из разных алфавитов и т.п... пытаться искать уже существующие названия с изменённой капитализацией и т.д., и т.п., как это сделать чисто на вьюхах не понятно, да и наверное, не нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2009, 09:25 |
|
||
|
Безопастность на уровне базы данных
|
|||
|---|---|---|---|
|
#18+
Денис Ильинна уровне хранимых процедур нужно защиту делать. это, скажем так, гораздо лучше расширяется. да и с вставками будет проблем меньше, например: можно запретить вводить названия, у которых в рамках одного слова встречаются буквы из разных алфавитов и т.п... пытаться искать уже существующие названия с изменённой капитализацией и т.д., и т.п., как это сделать чисто на вьюхах не понятно, да и наверное, не нужно. Так, а на уровне хранимых процедур вы имеете ввиду для каждого пользователя создавать свою хранимку и в ней делать нужны выборки/фильтры ну и всякие дополнительные проверки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2009, 17:05 |
|
||
|
Безопастность на уровне базы данных
|
|||
|---|---|---|---|
|
#18+
blestТак, а на уровне хранимых процедур вы имеете ввиду для каждого пользователя создавать свою хранимку и в ней делать нужны выборки/фильтры ну и всякие дополнительные проверки?Озверели?! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2009, 19:38 |
|
||
|
Безопастность на уровне базы данных
|
|||
|---|---|---|---|
|
#18+
Senya_LblestТак, а на уровне хранимых процедур вы имеете ввиду для каждого пользователя создавать свою хранимку и в ней делать нужны выборки/фильтры ну и всякие дополнительные проверки?Озверели?! Так я ж и прошу объяснить.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2009, 21:43 |
|
||
|
Безопастность на уровне базы данных
|
|||
|---|---|---|---|
|
#18+
человек начал думать в правильном направлении, но немножко не додумал. хранимая процедура, скажем, будет одна. будут даны пользователю права на её исполнение. скажем, эта процедура будет возвращать.. ну скажем, она будет возвращать всех подчинённых пользователя. в момент исполнения хранимой процедуры id пользователя, который её вызвал - известен. далее есть несколько способов, самый тупой и лобовой - это написать большой оператор switch / case. не лобовой - обратиться к таблице подчинения с headID = (id нашего пользователя) в общем идея такая - нужные данные (и только те, к которым имеет право доступа!) пользователь получает благодаря своему волшебному userID. в sql server этот id можно получить с помощью функции suser_id(), аналогичные штуковины есть и на (всех?..) остальных СУБД. как то так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2009, 22:33 |
|
||
|
Безопастность на уровне базы данных
|
|||
|---|---|---|---|
|
#18+
т.е. комбинируем 2 аутентификации: 1) имеет ли право пользователь вообще исполнять такую хранимую процедуру? это встроенный в сервер метод 2) гибкий метод (самопальный), основанный на знании userID. можно гибко давать практически любые права, детализация идёт вплоть до отдельных записей ( первый способ аутентификации такую возможность не даёт) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2009, 22:36 |
|
||
|
Безопастность на уровне базы данных
|
|||
|---|---|---|---|
|
#18+
Денис Ильинчеловек начал думать в правильном направлении, но немножко не додумал. хранимая процедура, скажем, будет одна. будут даны пользователю права на её исполнение. скажем, эта процедура будет возвращать.. ну скажем, она будет возвращать всех подчинённых пользователя. в момент исполнения хранимой процедуры id пользователя, который её вызвал - известен. далее есть несколько способов, самый тупой и лобовой - это написать большой оператор switch / case. не лобовой - обратиться к таблице подчинения с headID = (id нашего пользователя) в общем идея такая - нужные данные (и только те, к которым имеет право доступа!) пользователь получает благодаря своему волшебному userID. в sql server этот id можно получить с помощью функции suser_id(), аналогичные штуковины есть и на (всех?..) остальных СУБД. как то так. Про айдишник пользователя понятно. Тогда я насколько понял в основной таблице нужно создавать дополнительное поле, куда записывать этот userID пользователя создавшего строку? чтобы потом юзер имел возможность обратиться к тем строкам, которые он создал и уже в таблице подчиненя назначать различные права на его созданные строки, так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2009, 09:27 |
|
||
|
Безопастность на уровне базы данных
|
|||
|---|---|---|---|
|
#18+
blestПро айдишник пользователя понятно. Тогда я насколько понял в основной таблице нужно создавать дополнительное поле, куда записывать этот userID пользователя создавшего строку? чтобы потом юзер имел возможность обратиться к тем строкам, которые он создал и уже в таблице подчиненя назначать различные права на его созданные строки, так?Если уж Вы хотите "застолбить" отдельные строки в таблице за разными пользователями, то владение надо как-то обозначить. А как это сделаете - дело личное и зависит в том числе от СУБД. Заведите таблицу пользователей БД, а в таблице данных хранить их userID. Общее, пожалуй одно: исполняемая ХП должна иметь полный доступ к целевой таблице, пользователь должен иметь права на исполнение ХП, но не имеет права на SELECT из таблицы. ХП выступает в качестве "черного ящика", которая фильтрует выходной рекордсет. Например, в MSSQL это опция EXECUTE AS, в FB - гранты на SELECT для ХП. Как-то так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2009, 16:40 |
|
||
|
Безопастность на уровне базы данных
|
|||
|---|---|---|---|
|
#18+
Cat2Убей двойника К моменту "убивания" записи как ключивые могут быть уже обвехованы договорами, сотрудниками и прочей ... ерундой. Читаю вашу ссылку вспоминаю что "есть хирурги, а есть терапевты у которых само неужное отваливается" ))) Отдельная тема как заводить объект в базу дабы не было дубликатов Senya_L... Еще раз настаиваю на своем подходе преиведенном выше. А именно использовании ACL-кросстаблицы связи с полями типа ID_USER и ID_CONTRAGENT. Хранение ID_USER в данных исключает возможность дать доступ на строку таблицы нескольким пользователям. Для автора топика что такое ACL тоже найдете в вики ______________________________________________________ Давайте считать обступившее нас со всех строн коричневое море шоколадным ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2009, 17:20 |
|
||
|
Безопастность на уровне базы данных
|
|||
|---|---|---|---|
|
#18+
shelsoftSenya_L... Еще раз настаиваю на своем подходе преиведенном выше. А именно использовании ACL-кросстаблицы связи с полями типа ID_USER и ID_CONTRAGENT. Хранение ID_USER в данных исключает возможность дать доступ на строку таблицы нескольким пользователям. Я не против. Так оно, конечно, правильнее, но и сложнее. Если автора не пугают трудности и он решит использовать более сложные схемы - дам еще такой тынц . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2009, 17:32 |
|
||
|
Безопастность на уровне базы данных
|
|||
|---|---|---|---|
|
#18+
А как это сделаете - дело личное и зависит в том числе от СУБД. Заведите таблицу пользователей БД, а в таблице данных хранить их userID. можно в таблице с данными, на которые требуются права, скажем, хранить эти права в виде битовой маски, при чём не для отдельных пользователей, а сразу для групп пользователей. вполне себе кросс-RDBMS решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2009, 17:32 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=36233955&tid=1543045]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
173ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
30ms |
get tp. blocked users: |
1ms |
| others: | 231ms |
| total: | 466ms |

| 0 / 0 |
