Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
=^.^=
Зарегистрирован: 14.07.2008 Сообщения: 4
|
Добавлено: Пн Июл 14 2008 22:18 Заголовок сообщения: Ограничение доступа к данным таблиц БД на уровне записей |
|
|
Допустим у нас есть сервер MySQL и приложение на Dephi7 которое соединяется с ним через компонент ZEOSDBO. База состоит из 2-х таблиц, data (произвольные данные) и users (пользователи приложения). Таблицы связаны по полю user_id (один ко многим). Данные в таблице data, могут принадлежать разным пользователям, а контроль за доступом осуществляется только клиентским приложением, немного модифицировав его, злоумышленник может получить доступ к данным других пользователей. Как ограничить доступ пользователей к данным, на уровне записей таблиц? Как можно реализовать механизм контроля доступа пользователей к записям таблиц со стороны сервера? |
|
Вернуться к началу |
|
|
grf
Зарегистрирован: 05.04.2005 Сообщения: 1242 Откуда: Москва
|
Добавлено: Вт Июл 15 2008 07:45 Заголовок сообщения: |
|
|
насколько помню в MySQL есть права для пользователей на уровне базы данных, таблиц, столбцов. Так что запретить доступ на уровне записей силами сервера нереально.
Если не так, пусть меня поправят
_________________ Errare humanum est |
|
Вернуться к началу |
|
|
=^.^=
Зарегистрирован: 14.07.2008 Сообщения: 4
|
Добавлено: Вт Июл 15 2008 10:48 Заголовок сообщения: |
|
|
А можно ли ограничив доступ к базе данных (только чтение), создать что-то вроде хранимой процедуры для внесения изменений (добавление, удаление, редактирование записей)? (если такое нельзя реализовать на MySQL, думаю я смогу перенести базу на Interbase или Oracle). Если я не ересь несу, то клиент сможет выполнять запросы на изменение данных только через вызов процедуры, на сервере. Я с хранимыми процедурами знаком только на примере PLSQL и то чуть чуть, прошу сильно не ругать. Мне просто очень не хочется писать серверное приложение, которое будет своего рода прослойкой между базой данных и клиентом . |
|
Вернуться к началу |
|
|
C37
Зарегистрирован: 09.03.2005 Сообщения: 311
|
Добавлено: Вт Июл 15 2008 21:42 Заголовок сообщения: |
|
|
А есть ли необходимость хранить данные всех пользователей в общей таблице? Может быть, стоит дать каждому по персональной таблице (название совпадает с user_id)? |
|
Вернуться к началу |
|
|
=^.^=
Зарегистрирован: 14.07.2008 Сообщения: 4
|
Добавлено: Ср Июл 16 2008 10:30 Заголовок сообщения: |
|
|
К сожалению нет. Таблица с данными, должна быть открыта на чтение всем пользователям и запросы по этим данным буду охватывать все таблицы. Короче говоря запрос примет вид "select * from table_0, table_1, .... table_n" где это n может быть более 500. Запрос слишком длинный. |
|
Вернуться к началу |
|
|
C37
Зарегистрирован: 09.03.2005 Сообщения: 311
|
Добавлено: Ср Июл 16 2008 10:37 Заголовок сообщения: |
|
|
Вместо длинного запроса надо использовать представление (view), тогда пользовательское приложение будет видеть только две таблицы: свою, куда можно писать, и общую (т.е. представление), из которой можно только читать.
Основной «минус» здесь в том, что при добавлении нового пользователя придется обновлять определение представления. Чтобы этого избежать, можно использовать механизм наследования, но, если правильно помню, MySQL его не поддерживает. |
|
Вернуться к началу |
|
|
=^.^=
Зарегистрирован: 14.07.2008 Сообщения: 4
|
Добавлено: Пт Июл 18 2008 17:54 Заголовок сообщения: |
|
|
Бросил затею с MySQL начал изучать FireBird и заткнулся на первом же примере создания полей с autoincrement, так и не понял почему оно не работает.
Код: | SET SQL DIALECT 3
CREATE DATABASE 'localhost:C:\mybase.fdb'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 4096
DEFAULT CHARACTER SET NONE;
CREATE TABLE "test" (
"id" BIGINT NOT NULL,
PRIMARY KEY ("id")
);
CREATE SEQUENCE "id_counter";
ALTER SEQUENCE "id_counter" RESTART WITH 0;
SET TERM ^ ;
CREATE TRIGGER "on_insert" FOR "test"
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW."id" IS NULL) THEN
NEW."id" = GEN_ID("id_counter",1);
END^
SET TERM ; ^ |
При добавлении он вопит что поле id не заполнено, почему не отрабатывает триггер? Приношу извинения за свои тупые вопросы новичка. |
|
Вернуться к началу |
|
|
Dimasm
Зарегистрирован: 25.04.2005 Сообщения: 454
|
Добавлено: Ср Июл 23 2008 13:13 Заголовок сообщения: |
|
|
=^.^= писал(а): | А можно ли ограничив доступ к базе данных (только чтение), создать что-то вроде хранимой процедуры для внесения изменений (добавление, удаление, редактирование записей)? |
можно...
для этого, к табличке, где доступ нужно по строкам разделять, добавляешь поле user, в которое будешь указывать пользователя котому можно коннектиться... пользователь "видит" только хранимки
а в хранимке, когда делаешь выборку, пишешь так..
...
WHERE user_name = USER()
ну и если дальше развить, то понятно, что не имя, а ID, что не одно поле, а отдельную таблицу доступа
...WHERE access_id IN (SELECT access_id FROM access_table WHERE row_id=... AND user_id=421)
я немного не точно написал, но всё примерно в этом духе...
пробовал аналогично делать, отлично работает... как минус - надо отдельную табличку с пользователями держать, что, как говорят, плохо для безопасности _________________ С уважением Dimasm |
|
Вернуться к началу |
|
|
iv250973
Зарегистрирован: 30.11.2007 Сообщения: 12
|
Добавлено: Ср Июл 30 2008 09:39 Заголовок сообщения: |
|
|
C37 писал(а): | А есть ли необходимость хранить данные всех пользователей в общей таблице? Может быть, стоит дать каждому по персональной таблице (название совпадает с user_id)? |
Совершенно концептуально-неправильный подход. Ни один из существующих способов проектирования БД (сущность-связь, к примеру) не допускает такого использования таблиц. Реляционная таблица по сути есть проекция некоторого класса сущностей.
Если пойти по такому пути, то появится куча проблем, главная из которых - возможное огромное число таблиц. Запрос (а вьюшка по сути есть результат запроса), использующий такое кол-во таблиц будет выполняться гораздо медленнее, чем запрос к одной таблице. А в случае добавления или удаления юзера, ссылочную целостность придётся поддерживать нереляционными средствами, что тоже очень плохо. |
|
Вернуться к началу |
|
|
and3008
Зарегистрирован: 12.10.2001 Сообщения: 14893 Откуда: Н.Новгород
|
|
Вернуться к началу |
|
|
pa_han87
Зарегистрирован: 14.04.2006 Сообщения: 19
|
Добавлено: Сб Ноя 15 2008 23:41 Заголовок сообщения: |
|
|
Ограничение доступа на уровне записей точно есть в Oracle (Database Vault кажется называется) |
|
Вернуться к началу |
|
|
v_max
Зарегистрирован: 28.11.2008 Сообщения: 1
|
Добавлено: Пт Ноя 28 2008 15:10 Заголовок сообщения: |
|
|
Если интересует защита информации на уровне СУБД, можно посмотреть в сторону ЛИНТЕР. Там этому вопросу уделено большое внимание - есть и защита на уровне записей и много чего ещё.
Общее описание системы защиты ЛИНТЕР: http://www.linter.ru/ru/documentation/html/mod_szi.htm |
|
Вернуться к началу |
|
|
критикан
Зарегистрирован: 18.02.2005 Сообщения: 247
|
Добавлено: Ср Дек 03 2008 10:56 Заголовок сообщения: совет новичкам: стреляйте в лоб -- не попадёте в Библию |
|
|
странно, что эта мёртвая ветка никак в могилу не уйдёт. видимо, не хватает моего контрольного выстрела.
сам вопрос об ограничении доступа на уровне записей говорит только об одном -- сама база данных спроектирована неправильно. при хорошем устройстве принципиально разные предметы-явления отражают в разных таблицах. внутри одной таблицы разные записи суть однородный набор совершенно равноценных данных, для которых нет никакого смысла к одной части этих данных давать доступ, а к другой -- нет. ненужность разделения доступа на уровне записей покажет такой пример:
Пример:
пусть есть некоторое явление, которое потребителя интересует как сумма большого числа слагаемых. естественно, что запись такого явления в базе данных будет спроектирована в виде таблицы, в которой отдельные слагаемые будут отражены в виде записей. очевидно, что никому в голову не придёт мысль об ограничении доступа к какой-то части записей в этой таблице, потому что все слагаемые абсолютно равноценны.
поэтому, если база данных спроектирована правильно -- что означает в том числе полную равнозначность записей в любой заданной таблице, -- то вопроса об ограничении доступа на уровне записей просто не возникает.
однако, я признаю, что некоторые "проектировщики" по соображениям, выходящим за рамки разумных, например, по соображениям, как они называют (и искренне верят в это), эффективности, производительности и т. п. всё-таки вводят в одну таблицу в виде записей принципиально разные предметы-явления (то есть записи становятся неравноценными), к которым приходится давать разный доступ уже на уровне записей, то для этого случая разработчики СУБД придумали достойный отпор -- представления (вьюшки, если говорить высоконаучным языком). в этом случает список требуемых записей отображается во вьюшке, и доступ даётся ко вьюшке, а не к основной таблице. в нашем примере это будет выглядеть так:
Пример:
пусть в одну таблицу загнали записи, которые отражают сумму большого числа слагаемых и произведение большого числа множителей. тогда действительно можно представить, что одним господам необходимо разрешить доступ только к записям, которые являются слагаемыми, другим господам -- к множителям. поступаем просто: делаем отдельную вьюшку для слагаемых и отдельную -- для множителей. первым господам даём доступ к вьюшке слагаемых, второй -- к вьюшке множителей, но никому из них не даём доступа к самой таблице.
некоторые участники форума думают, что для решения вопроса доступа на уровне записей можно использовать триггеры и хранимые процедуры. это верно, но это стрельба из пушки по воробьям и по трудозатратам, и по результатам.
-------------------------------------------------------------------
из книги "Киллерство для чайников": всегда делайте контрольный выстрел в лоб, потому что предыдущий выстрел в грудь попал клиенту в подаренную ему любимой девушкой Библию в металлическом переплёте, которую клиент носил у сердца |
|
Вернуться к началу |
|
|
|