|
2 / 2 / 1
Регистрация: 18.10.2007
Сообщений: 1,748
|
|
Безопасность SQL Server04.04.2011, 12:40. Показов 2906. Ответов 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): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
|
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога
SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
|
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
|
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога
SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
|