Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

В каком либо сервере баз данных реализованы привилегии на уровне ЗАПИСИ

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Базы данных
Предыдущая тема :: Следующая тема  
Автор Сообщение
s_tristan



Зарегистрирован: 16.06.2003
Сообщения: 6
Откуда: Kiev

СообщениеДобавлено: Ср Окт 29 2003 02:29    Заголовок сообщения: В каком либо сервере баз данных реализованы привилегии на уровне ЗАПИСИ Ответить с цитатой

Сабж, собственно
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
and3008



Зарегистрирован: 12.10.2001
Сообщения: 14893
Откуда: Н.Новгород

СообщениеДобавлено: Ср Окт 29 2003 13:31    Заголовок сообщения: Сам понял, что спросил? Привелегии седлаются на уровне полей, а не записей. Записей может быть триллионы. (-) Ответить с цитатой

-
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
s_tristan



Зарегистрирован: 16.06.2003
Сообщения: 6
Откуда: Kiev

СообщениеДобавлено: Ср Окт 29 2003 16:46    Заголовок сообщения: Re: В каком либо сервере баз данных реализованы привилегии на уровне ЗАПИСИ Ответить с цитатой

У меня вот такая, казалось бы, тривиальная задача: есть абстрактная база с одной таблицей. В нее добавляют записи, скажем, Петров, Иванов и Сидоров. Как мне сделать так, чтобы на запрос Петрова сервер, во-первых, понимал, что это Петров, а во-вторых выдавал ему только его, Петрова, записи, причем, чтобы остальные записи Петров не мог даже читать. Да, я понимаю, что со стороны клиента это сделать довольно легко - строка SQL в предложении WHERE будет содержать что-то вроде UserID='Петров', НО если Петров имеет у себя текст этой строки, то что ему мешает заменить UserID='Петров' на UserID='Иванов' и прочитать записи Иванова? Это значит, что я не могу имя пользователя посылать в строке SQL. Сервер, и только он, должен решать какие записи кому выдавать, а имя пользователя он берет из параметров подключения, а не из строки SQL. Это значит, что даже если злоумышленник Сидоров в строке SQL пропишет UserID='Петров', то сервер должен вернуть ему записей!
Может у меня совершенно неправильное понимание концепции разграничения прав пользователей? Если так, что буду признателен за сссылку на соответствующую литературу.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
and3008



Зарегистрирован: 12.10.2001
Сообщения: 14893
Откуда: Н.Новгород

СообщениеДобавлено: Ср Окт 29 2003 17:29    Заголовок сообщения: Да это проблемма... Простое решение, но не единственное:(+) Ответить с цитатой

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

При подключении к базе - обязательная авторизация.

Есть шанс, что трафик перехватят снифером, но от этой напасти есть шифрование трафика средствами самого SQL-сервера и на худой конец IPSec, если SQL-сервер не имеет собственных средств шифрования.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
s_tristan



Зарегистрирован: 16.06.2003
Сообщения: 6
Откуда: Kiev

СообщениеДобавлено: Чт Окт 30 2003 20:07    Заголовок сообщения: Re: Да это проблемма... Простое решение, но не единственное:(+) Ответить с цитатой

Подождите, порассуждаю...
Итак есть сервер. Также есть клиент, написанный на произвольном языке и который рано или поздно будет взломан. В нем зашита строка подключения типа там SERVER="xxx.xxx.xxx.xxx;DATABASE=Test;UserID=UID;PASSWORD=PW D", где UID и PWD - переменные (то бишь в коде клиента их нигде нет и которые юсер обязан внести ручками) нехилой длины и случайно сгенерированные. Также там имеется строка SQL с предложением WHERE UserID=UID. Теперь предположем, что юсер захочет получить доступ к чужим записям. Он поломает клиента, возьмет строку подключения и подключится из консоли к серверу. Далее он берет строку SQL, убирает строку WHERE нафиг и посылает ее серверу. Ответит сервер? Конечно - он вернет ВСЕ записи из таблицы. Вот и вся петрушка. В связи с этим нужно как-то реализовать следующий механизм:
1. Строка подключения остается прежней - хай подключается на здоровье.
2. Строка SQL не содержит предложения WHERE
3. Сервер при приеме строки SQL делает следующее:
3.1 смотрит в своей таблице пользователей наличие записи с UID и PWD, которые он берет из параметров текущего подключения
3.2 в найденной строке считывает УНИКАЛЬНЫЙ и НИКОМУ неизвестный КОД этого юсера
3.3 Самостоятельно составляет предложение WHERE с этип кодом
3.4 Приплюсовывает созданное предложение WHERE к исходной строке SQL
3.5 и наконец выдает юсеру записи соответствующие окончательному варианту строки SQL

Вопрос 1 - какой из серверов, желательно OpenSource, такое умеет делать (понятно, что после программирования)?
Вопрос 2 - может есть другое решение?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
and3008



Зарегистрирован: 12.10.2001
Сообщения: 14893
Откуда: Н.Новгород

СообщениеДобавлено: Пт Окт 31 2003 11:36    Заголовок сообщения: А если так (+) Ответить с цитатой

Имеем таблицу UID, PWD
Имеем хранимую процедуру на сервере, которая принимает UID и PWD и возвращает клиенту номер сессии в случае правильного пароля и в случае неправильного.
Сервер записывает во временную таблицу пару UID и номер сессии.

После этого клиент общается с сервером посредством хранимых процедур, отправляя SQL запрос и номер сессии.

Сервер перед выполнением запроса проверяет соответствие сессии и UID, слегка меняет исходный запрос и выполняет.

Возникает вопрос с тем, что делать, когда клиент отключается... Наверняка при разрыве сессии сервер выполняет какие-то действия, которые несколько расширить.

Идея понятна?

Из Open Source рекомендую поглядеть в первую очередь на Postgress
Он вроде бы нормально работает с хранинмыми процедурами.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
MaDDog
Гость





СообщениеДобавлено: Вт Ноя 04 2003 00:57    Заголовок сообщения: Re: А если так (+) Ответить с цитатой

А можно еще проще..

Вар1: Та же хранимая процедура никакими сессиями не занимается, выбирает из параметров подключения UID, через таблицу согласования смотрит ID юзера и соответственно выполняет запрос и возвращает данные.

Вар2: Вариант уродский, но работает везде(!), даже с MySQL Smile
Для каждого пользователя, кому нужен такой сервис, создается представление, возвращающее только его записи. Доступ имеет только этот самый юзер. В клиенте, исходя из имени юзера составляется запрос именно к тому view, к которому надо.
Понятно, что если пользователей сотни, то вариант не подходит. Но тогда - серьезная СУБД и Вар1.
Вернуться к началу
Борис
Гость





СообщениеДобавлено: Вт Ноя 18 2003 15:19    Заголовок сообщения: :( Вариант 2 не уродский, но работает не везде (+) Ответить с цитатой

Вариант 2 самый естественный, так как в конечном счёте доступ к таблицам определяется индивидуально по каждой таблице и по каждому пользователю (поэтому лего создавать представления для каждой таблицы), но, к сожалению, вариант не работает для добавления/обновления данных.

100%-ный вариант -- переписать сервер (по сути вар. 1), чтобы он ко всем запросам добавлял фильтр WHERE. Но трудно.
Вернуться к началу
pnchl
Гость





СообщениеДобавлено: Пн Дек 01 2003 18:03    Заголовок сообщения: В Oracle всё есть Ответить с цитатой

Почитай в хелпе по Oracle "Establishing Security Policies" - там описано, как установить разделение доступа на уровне записей. Сервер как раз добавляет неявное условие в WHERE...
Вернуться к началу
pnchl
Гость





СообщениеДобавлено: Пн Дек 01 2003 18:19    Заголовок сообщения: В Oracle можно и проще Ответить с цитатой

В Oracle есть такая функция - userID - она возвращает имя текущего пользователя. Можно вообще не давать доступа на чтение из таблицы с данными, а создать представление:

create view1 as select * from table1 t where t.user_name = userID

Более того, в Oracle можно вообще не давать никакого доступа к таблице, а дать доступ на запись (!) в представление. При этом для представления должен быть опеределен триггер INSTEAD OF (INSERT или UPDATE). Пользователи будут считать, что работают с реальной таблицей с полными данными...
Вернуться к началу
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Базы данных Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...