|
2 / 2 / 1
Регистрация: 18.10.2007
Сообщений: 1,748
|
|
Безопасность SQL Server04.04.2011, 12:40. Показов 2911. Ответов 23
Метки нет (Все метки)
Приветствую.
Решил разобраться с безопасностью в SQL Server. И, чисто как пример - написать чат, который напрямую коннектится к серверу. Мысли следующие: Есть три таблицы - Users, Messages, PrivateMessages. В Users храняться все настройки пользователей, включая логин с паролем. Messages - общедоступная таблица для сообщений основного канала. PrivateMessages - таблица личных сообщений. Все юзеры будут подключаться с одни общим логином, у которого нет никаких прав на просмотр/изменение таблиц, но есть права на хранимые процедуры. Далее. Как будет проходить процедура авторизации. Здесь уже речь идет о возможности перехвата трафика. Перед подключением клиент вводит логин с паролем. Когда клиент коннектится, ему сервером при помощи хранимой процедуры и инструкции PRINT передается значение глобальной переменной @@SPID, зашифрованное в MD5. Соответственно, клиент это ловит в событии коннекшена InfoMessage. На стороне клиента введенный пароль шифруется тем же самым MD5 с полученным ключом. Далее вызывается хранимая процедура с двумя параметрами, возвращающая 1 в случае наличия совпадения и 0 – соответственно в случае отсутствия. На этом, можно сказать, авторизация завершена. Далее все операции (изменение юзерских настроек, отправка/принятие сообщений) происходят опять же путем вызова соответствующих процедур, которые, на основе @@SPID понимают, что это за юзер и, соответственно, выдают информацию, доступную только для него. Все казалось бы хорошо, но есть минус. @@SPID принимает слишком простые значения по порядку, которые к тому же повторяются после отключения клиента. Т.е. легко отловить их все. Всвязи с этим есть другая идея. Генерировать рэндомом какое-то уникальное число при подключении клиента. НО. Что его может генерировать? Что реагирует на подключение юзера? Возможно, привязывать @@SPID к времени подключения пользователя и на этих данных генерировать ключ. Но нет глобальной переменной начала сессии… Так что такие вот дела. Жду идей, предложений и замечаний. Тема, как мне кажется, достаточно интересная. Заранее спасибо.
0
|
|
| 04.04.2011, 12:40 | |
|
Ответы с готовыми решениями:
23
[Microsoft][ODBC SQL Server Driver][SQL Server]Login failed- User: Reason: Not defined as a valid user of a trusted SQL Server connection
|
|
0 / 0 / 0
Регистрация: 01.03.2010
Сообщений: 223
|
|
| 04.04.2011, 14:57 | |
|
а если сделать randomize (кол-во секунд с 1 января 1970 года) ?
0
|
|
|
2 / 2 / 1
Регистрация: 18.10.2007
Сообщений: 1,748
|
|
| 04.04.2011, 15:22 [ТС] | |
|
'Генерировать рэндомом какое-то уникальное число при подключении клиента. НО. Что его может генерировать? Что реагирует на подключение юзера? '
0
|
|
|
Silver
|
|
| 04.04.2011, 15:37 | |
|
посмотри в поле login_time таблицы master..sysprocesses
|
|
|
0 / 0 / 0
Регистрация: 01.03.2010
Сообщений: 223
|
||||||
| 04.04.2011, 15:43 | ||||||
|
ну хорошо.
а если так?
0
|
||||||
|
2 / 2 / 1
Регистрация: 18.10.2007
Сообщений: 1,748
|
|
| 04.04.2011, 16:37 [ТС] | |
|
2Silver: логин у всех один
2PMSSpy: Не понял задумки... подробнее...
0
|
|
|
0 / 0 / 0
Регистрация: 01.03.2010
Сообщений: 223
|
|
| 04.04.2011, 17:31 | |
|
ну грубо говоря так:
создаем таблицу. пользователь входит на сайт (страница приветствия) здесь срабатывает скрипт добавления в таблицу еще одной записи и тут же возвращает значение (по моей задумке - достаточно id, хотя таблицу можно использовать для сбора данных о пользователе) id уникален - потому как я предлагаю использовать его в качестве primary key (ключ) с автоинкрементом (для уникальности).
0
|
|
|
2 / 2 / 1
Регистрация: 18.10.2007
Сообщений: 1,748
|
|
| 04.04.2011, 17:38 [ТС] | |
|
Хм... может я не очень подробно описал, но мне кажется, что из описания вполне понятно, что это не ASP.
Нет никакого сайта. Есть клиентская прога. И SQL Server.
0
|
|
|
0 / 0 / 0
Регистрация: 01.03.2010
Сообщений: 223
|
|
| 04.04.2011, 17:44 | |
|
тогда триггер
пусть пользователь вызывает какое-нибудь событие на сервере
0
|
|
|
2 / 2 / 1
Регистрация: 18.10.2007
Сообщений: 1,748
|
|
| 04.04.2011, 17:58 [ТС] | |
|
Триггер. про это я уже думал.
Но предлоежния есть какие-нибудь? какое событие? надо, чтобы сервер сразу при подключении запускал этот триггер.
0
|
|
|
0 / 0 / 0
Регистрация: 01.03.2010
Сообщений: 223
|
|
| 04.04.2011, 18:06 | |
|
еще раз повторюсь. пусть клиент приветствует сервер добавлением строчки о себе в табличку посещений. типа 'привет тебе с IP xxx.xxx.xxx.xxx. время такое-то'
и на добавление записи ставь триггер
0
|
|
|
2 / 2 / 1
Регистрация: 18.10.2007
Сообщений: 1,748
|
|
| 04.04.2011, 23:40 [ТС] | |
|
мда... с работы домой ехал - обдумал твое предложение... видимо, на самом деле, стоит сделать именно так... Только не по IP, а по нику идентификация. Спасибо за предложенный вариант.
Так вот... алгоритм вроде бы следующий.... Если что-то не так (заметите дырку, какую-то ошибку, или если появится какой-то другой вариант) - прошу отписать) 1. После коннекта юзера он обращается к ХП в качестве параметра передает ник. 2. ХП записывает в таблицу logins Ник и Время текущего обращения. 3. Методом Print выдает Значение MD5, сгенерированное на основе времени и @@SPID. 4. Клиент кодирует пароль на основе полученного ключа в MD5 и запускает другую ХП с парамиетрами НИК и Зашифрованный пароль. 5. ХП делает следующее... а) проверяет, есть ли в таблице logins запрос для данного ника. б) если нет- отфутболивает. в) узнает, каким должен быть зашифрованный пароль из Users для данного ника используя данные из Logins и @@SPID. г) в случае несовпадения – отфутболивает, в случае совпадения – помечает в таблице logins, что авторизация прошла успешно и что эту строку уже использовать нельзя. Ну чтож... вроде ничего не забыл. Если ошибаюсь - прошу поправить.
0
|
|
|
0 / 0 / 0
Регистрация: 01.03.2010
Сообщений: 223
|
|
| 05.04.2011, 09:04 | |
|
я вот что еще подумал.
по умолчанию все пользователи имеют право обращаться СТРОГО к этой самой ХП и ничему больше. Если пользователи лезет куда не надо - отфутболить. И по тайм-ауту тоже отфутболить, скажем через 30-45 секунд.
0
|
|
|
Silver
|
||||||
| 05.04.2011, 10:28 | ||||||
|
Логин конечно один, но spid разный.
Делая выборку по spid мы можем получить уникальное время подключения к базе. Вот пример ХП
|
||||||
|
Silver
|
|
| 05.04.2011, 10:57 | |
|
Боюсь, что данная схема неработоспособна.
-- цитата --- Все юзеры будут подключаться с одни общим логином, у которого нет никаких прав на просмотр/изменение таблиц, но есть права на хранимые процедуры. ------------- Если я правильно понял, то коннект будет осуществляться с единым логином и паролем, так? Но почему ты считаешь, что если 'нет никаких прав на просмотр/изменение таблиц' напрямую, то права будут в хранимой процедуре? |
|
|
2 / 2 / 1
Регистрация: 18.10.2007
Сообщений: 1,748
|
|
| 05.04.2011, 12:22 [ТС] | |
|
2Silver:
Это стандартный способ. Создай таблицу, запрети на нее доступ юзеру. Создай процедуру AS select * from table. Попробуй обратиться к таблице с запросом select * from table и затем запустить процедуру. Запрос выдаст ошибку - будет орать о запрещенном доступе. Процедура же выполнится без проблемм. и вопрос по поводу времени логина... таблица sysprocesses не существует. 2PMSSpy: 'по умолчанию все пользователи имеют право обращаться СТРОГО к этой самой ХП и ничему больше.' Вопрос в том как реализовать. По таймаутут тоже отфутболивать, согласен. Но, еще вопрос. Человек выходит некорректно из чата (завис/выключили эл-во/т.д.). Как отследить его уход и добавить сообщение в канал о том, что он исчез? На мой взгляд - вариант только один - от юзера посылать каждые, к примеру, 10 секунд сообщения серверу (обновлять таблицу Users) и устанавливать дату последнего обновления. И написать просьенькую серверную программулину, которая будет слдедить - если разница между ткущим временем и последним апдейтом какого-то юзера более 15 секунд, то выдавать сообщение о выходе юзера.
0
|
|
|
0 / 0 / 0
Регистрация: 01.03.2010
Сообщений: 223
|
|
| 05.04.2011, 12:33 | |
|
согласен.
может интервал, в течение которого пользователь обязан сделать запрос на сервер, тоже хранить в таблице и выдавать настройки при логине? и опять же пресловутый триггер на тайм-аут?
0
|
|
|
2 / 2 / 1
Регистрация: 18.10.2007
Сообщений: 1,748
|
|
| 05.04.2011, 12:42 [ТС] | |
|
А зачем? Если будет известно время последнего обращения, то его всегда можно сравнить с текущим.
А что за триггер на таймаут? Сам по себе он не запустится...
0
|
|
|
0 / 0 / 0
Регистрация: 01.03.2010
Сообщений: 223
|
|
| 05.04.2011, 13:16 | |
|
а как ты планируешь реализовывать отключение по тайм-ауту и вместе с этим сообщать в чат, что юзер ушел?
0
|
|
|
2 / 2 / 1
Регистрация: 18.10.2007
Сообщений: 1,748
|
|
| 05.04.2011, 13:21 [ТС] | |
|
'И написать просьенькую серверную программулину, которая будет слдедить - если разница между ткущим временем и последним апдейтом какого-то юзера более 15 секунд, то выдавать сообщение о выходе юзера.'
0
|
|
| 05.04.2011, 13:21 | |
|
Помогаю со студенческими работами здесь
20
Подключиться к SQL 2000. BASE_STRING = 'Driver={SQL Server};Server=(local);Database=mybase; Как можно осуществить репликацию между офисной БД (MS SQL Server) и БД в Интернете (MS SQL Server) ? Microsoft SQL Server Compact Edition в SQL Server Management Studio Express SQL Server 2012 Management Studio Express не появляется служба SQL Server Настройка SQL Server 2008 для работы с SQL Server Management Studio Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|