Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
[YII] - Соединиться с БД тем именем и паролем, под которыми залогинился пользователь
|
|||
|---|---|---|---|
|
#18+
Я хочу чтобы каждый пользователь логинился только если он заведен в качестве пользователя в БД и соответственно все изменения в БД он будет выполнять от своего имени и права на объекты БД у него были бы заданы в самой БД. Таким образом я хочу чтобы в config\main.php ->components/db/ username и password были пустыми и только лишь в момент когда пользователь залогинивается, программно указать имя/пароль к БД и соедениться. И соответственно, если он заведен как пользователь БД, то логин пройдет успешно, если нет, то нет. То есть перед обращением к БД нужно сделать типа такого Код: php 1. 2. Так как пароль нигде не хранится я его пихаю в $_SESSION при авторизации в UserIdentity.php Мой вопрос - где именно вставить эти две строчки. Пихать в каждый acton - это явное быдлокодерсво. Как-то можно отловить момент когда приложение уже инициализировано, но еще не запустился action ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2014, 09:23 |
|
||
|
[YII] - Соединиться с БД тем именем и паролем, под которыми залогинился пользователь
|
|||
|---|---|---|---|
|
#18+
Странное желание, обычно от этого наоборот уходят. Вам же всё равно придется рисовать интерфейс в зависимости от доступов и ролей пользователя. А эти досутпы и роли должны где-то храниться в БД или в конфигах. Если использовать пользователей уровня DB, то вы по-сути теряете всю мощь RBAC. Ни тебе бизнес правил, ни тасков, ни ролей, ни доступов. Либо придется в базе поддерживать спец-таблицы с обвесом пользователя, да так, чтобы к ним имел доступ каждый пользователь уровня базы, иначе, залогинившись, очередной юзер не сможет получить свои роли и доступы и благополучно отвалится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2014, 00:11 |
|
||
|
[YII] - Соединиться с БД тем именем и паролем, под которыми залогинился пользователь
|
|||
|---|---|---|---|
|
#18+
anvano, Цель - гарантировать на уровне БД , что пользователь не получит доступ к данным, которые он не имеет права видеть/менять. Т.е. двойная защита - первый уровень - сайт, а второй - доступы к объектам БД на основе ролей выданный пользователям. Если сайт удастся кому-то ломануть, в базе ничего сверх того на что ему выдан доступ он не сможет увидеть. Ну а правила, роли, задачи - для этого действительно завести отдельную таблицу, но и ее не все видят, а имеют доступ пользователи лишь к представлению типа Код: sql 1. т.е. видят лишь одну запись, со своими данными. Приложение связанно с деньгами и безопасность во главу угла. Гарантировать что сайт не взломают невозможно, так что фактически единственный надежный метод защиты - тщательная настройка прав на уровне пользователя БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2014, 10:14 |
|
||
|
[YII] - Соединиться с БД тем именем и паролем, под которыми залогинился пользователь
|
|||
|---|---|---|---|
|
#18+
вообще нормальная идея, и критик гонит, все не уходят, все бездумно делают как петя в статье в инете... уходят это значит, делали так потом отказались. господин критик, и много вы сайтов сделали таким образом? так что норм у тебя идея, правда я не понял зачем - :) ну тебе виднее. всётаки критик верно подметил сказав фразу - взависимости от прав рендериться и чтото там ещо. вообщем мысль имеет право быть - ИИИ всётаки фреймоврк, и у него есть определёная политика партии, и вплане работы с базой, это всётаки работа от одного имени. Так что возможно тебя ожидают переделки в ИИИ ну либо геморой на твою попу. НО а как будет ити создание нового пользователя??? если это делает сайт, от имени суперадмина, создаёт юзеру, наделяет его правами, то можешь забыть про свою идею двойно безопасности. другое дело, если пользователи создаються по заявкам, грубо говоря админом не через сайт, а сайт имеет дело только с готовым. не знаю как в ИИИ точно, но подозреваю что есть метод создания подключения к базе, и у него идёт вызов, дабы найти в конфиге для заданого подключения, пароль и юзера... и вот надо переопределить клас, что у тебя есть имя ГЫГЫГЫ, при котором юзер и пароль щитываються не из конфига а определяються по текущему юзеру. или проще. создать клас свой, сметодом ту стринг, который при преобразовании в строку, выдаст пароль/юзер. и обьект даного класа фигачить в конфиг вкачестве значений. когда будет обращение к базе, будут взяты настройки подключения, и в это время твой клас выдаст текстом то что нужно. НО НО а где ты возьмёшь пароль пользователя??? будеш хранить в сессии или ещо гдето. тут опять возникает делема, нафига эта вся супер секьюрность базы, если хакер получит пароли текущих юзеров, просмотрев файл сесий(предполагаем, что сайт взломан) замучаешься! идея оригинальная, но раз шттп протокол, то надо авторизацию будет усложнять ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2014, 11:17 |
|
||
|
[YII] - Соединиться с БД тем именем и паролем, под которыми залогинился пользователь
|
|||
|---|---|---|---|
|
#18+
Итак, сначала отвечу по вопросу, а потом расскажу почему так не надо делать :) 1. В Yii не надо для этого никаких особых изворотов. Соединение с базой описывается через объект CDbConnection . В нём просто надо покопаться... создаём на лету новое соединение и выставляем его как основное соединение, после чего все обращения к базе происходят через это соединение. 2. А не надо так делать, потому как никакого "второго уровня защиты" не получится. Это то же самое, что и требование кодировать пароль в md5 на стороне клиента, защищая сайт от взлома... ЭТО ТАК НЕ РАБОТАЕТ!!! Если я стяну с компа пользователя куки (в частности id сессии), то как БД узнает, что я не тот пользователь, каким представился? А никак :) Она меня пустит на ровне с реальным владельцем аккаунта. Если как-то получится стянуть пароль пользователя, то залогинившись, меня точно так же база пустит к себе с правами пользователя. Это то же самое, что и повесить на дверь 2 замка открываемых одним ключом :) Если взломщик сможет выточить ключ открывающий первый замок, то и второй открыть будет очень просто (за исключением случаев, когда замок будут взламывать на месте или пытаться с ноги выбить дверь... но это действия явных делитантов). А вот Вам, высверливать ещё одну дырку, потом ставить новый замок... потом, если дверь надо будет сменить, новая дверь будет металлическая и будет предусматривать только один замок - Вам придётся и её пилить и резать... В случае, если после этого дверь сломается, то производитель Вас же и обвинит в проблеме (и будет прав). В общем преимуществ - 0, а проблем - выше крыши. Но, как говорит один из моих бывших руководителей "тебе из погреба виднее" :) Я бы посоветовал просто покопать в сторону усиления защиты, если это уж так необходимо. Вон, как в банках... Вход не по паролю, а по коду, пересылаемому на телефон после ввода пароля на сайте... И ты хоть умри, но если телефона в руках нету - ты не тот пользователь, кем представляешься. Или вон как в swedbank'е работает система входа в личный кабинет (не знаю как у нас, пользовался их услугами за границей), они выдают специальную хренотень, по входу через логин и пароль, ты получаешь сгенерированный сайтом код, который вводишь в эту штуковину, а ответ забиваешь на сайт... ВОТ ЭТО ВТОРОЙ УРОВЕНЬ ЗАЩИТЫ, заполучи что-то одно и у тебя ничего не получится. Или как openId работает (если правильно помню). При регистрации сайта в системе, тебе выдают логин, пароль и ключ шифрования. Ты даёшь запрос на вход (получение данных пользователя), тебе отправляют код, к которому применяется этот ключ и получается token, который отправляется на сервер, который в свою очередь по тем же правилам генерирует такой же token. И только в случае их совпадения можно попасть в систему. Однако... заставьте на рядовом сайте без особых конфиденциальных данных пользователя вводить 2-3 пароля и проходить уйму уровней защиты и получите максимум несколько десятков регистрированных пользователей, которым это реально надо. Остальные просто забьют на регистрацию и пойдут на сайт конкурентов с удобной для них системой :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2014, 14:28 |
|
||
|
[YII] - Соединиться с БД тем именем и паролем, под которыми залогинился пользователь
|
|||
|---|---|---|---|
|
#18+
Програмёр, дык никто и не спорит, что для сайта это будет проблемой так защиту сделать, но критик то раскритиковал что это бред, до того как узнал причину :) а так да... если сайт взломан, то все что знает сайт, доступно злоумышленику, и следовательно он может дампить все пароли других юзеров. и следовательно с трудом но точно также получать доступ ко всем данным. а вот если просто перенести логику распределения пров в базу, то это вполне рабочий пример. из любого кода - пхп, питон, ещо чтото, заходит юзер в таблицу юзеров и видит там только одну запись, свою. пытаеться вставить нового юзера - ошибка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2014, 15:16 |
|
||
|
[YII] - Соединиться с БД тем именем и паролем, под которыми залогинился пользователь
|
|||
|---|---|---|---|
|
#18+
авторВон, как в банках... Вход не по паролю , а по коду, пересылаемому на телефон после ввода пароля на сайте... ты в своем репертуаре, да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2014, 15:18 |
|
||
|
[YII] - Соединиться с БД тем именем и паролем, под которыми залогинился пользователь
|
|||
|---|---|---|---|
|
#18+
авториз любого кода - пхп, питон, ещо чтото, заходит юзер в таблицу юзеров и видит там только одну запись, свою. из за тотальной ненужности эта фича реализованна помоему только в Оракле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2014, 15:19 |
|
||
|
[YII] - Соединиться с БД тем именем и паролем, под которыми залогинился пользователь
|
|||
|---|---|---|---|
|
#18+
ScareCrowавторВон, как в банках... Вход не по паролю , а по коду, пересылаемому на телефон после ввода пароля на сайте... ты в своем репертуаре, да. Да.. Раньше на этом сайте для меня число сообщений пользователя было очень весомым показателем его опыта (я безоговорочно верил тому, что писали мне люди с 2-3 десятками тысяч сообщений). После общения с тобой, я понял что это явно не показатель. Не хочу никого обидеть (не о глупости/уме пишу, а о бессмысленных сообщениях)... но если собрать все твои сообщения в темах, в которых мы пересекались то, думаю процентов только 5 будет по теме... Настроения просто нету ) Давай, если тебе есть что сказать по теме - пиши, с удовольствием обсудим... а так - нафига воду мутить лишний раз? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2014, 15:46 |
|
||
|
[YII] - Соединиться с БД тем именем и паролем, под которыми залогинился пользователь
|
|||
|---|---|---|---|
|
#18+
SQL-Talker, Кстати, а пароль то в сессии точно хранить не надо (внимательно первое сообщение перечитал). Иначе опять же заполучив доступ к сессиям мне даже не надо будет ничего ломать... я просто в прямом виде стяну пароль и всё. :) Потому как минимум в md5 его туда писать, а вообще - и в md5 не надо (хоть алгоритм и необратим, есть алгоритмы подбора значений для соответствующего md5 значения). Потому ещё раз повторю, стараясь закрыть дырку с одной стороны, ты её же и открываешь с другой (какая разница где хранить пароль, в сессии или в базе, пароль от которой хранится в конфиге). Есть куча других методов взломать сервер и получить доступ к аккаунту любого использующего сайт пользователя. Элементарно - загрузка файла php через форму с последующим выполнением (при неверных настройках), разного рода инъекции, стягивание куков у пользователя, вирусы-шпионы на компе пользователя. Со стороны сервера защита на уровне mysql не нужна, так как защищается не именно база, а пользователь.. Потому не дав доступа к базе, но дав доступ к данным вводимым пользователем (если получится свой скрипт на хосте запустить), задача достигнута не будет. Закрываем запуск пользовательских файлов на сервере, убираем разного рода exec из кода, избавляемся от всех возможностей указать путь файла из командной строки (такие случаи иногда бывают в попытке добиться простоты и универсальности в модулях для знаменитых cms), экранируем все пользовательские данные при обращении в базу, экранируем всё, что вводят пользователи и что показывается другим пользователям (типа как комментарии, в которых может сидеть javascript)... предпринимаем ряд подобных действий и сайт становится непроникаемым (разве только хостер ступит, но это уже его проблемы) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2014, 16:17 |
|
||
|
[YII] - Соединиться с БД тем именем и паролем, под которыми залогинился пользователь
|
|||
|---|---|---|---|
|
#18+
В общем, придется отказаться от этой мысли. Парни, спасибо вам, картина прояснилась. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2014, 17:53 |
|
||
|
[YII] - Соединиться с БД тем именем и паролем, под которыми залогинился пользователь
|
|||
|---|---|---|---|
|
#18+
Почему "отказаться"? Мысль вполне здравая и нормальная. Все остальное что тут написали наши коллеги это "мысли по теме" не относящиеся к проблеме. Юзер должен быть зарегестрирован у тебя в центральном списке юзеров (иначе как отличить "твоего" от "не твоего" юзера?). У юзера должны быть некие права (хотя бы на уровне "видеть объекты из этой группы и не видеть из той"). Так спрашивается, где ты будешь хранить эти списки? Правильно, в некой базе данных. Так что ты в ЛЮБОМ случае будешь использовать имя-пароль юзера для подключения к базе данных и будешь брать список ролей юзера из этой базы данных. А вот будет эта база той-же самой где хранятся бизнес объекты или отдельной базой - это уже детали реализации. Могут они быть общей базой? Да могут. Будет ли это проще в сопровождении? Возможно, но необязательно. Если модель прав используемых в твоей СУБД отличается от модели прав в твоей фирме - твоя идея будет неудобной. Например если в СУБД будет ограничение что один юзер принадлежит только одной группе, а МарьВанна одновременно и бухгалтер и кладовщик - то ты не сможешь в такой СУБД удобно зарегистрировать МарьВанну. Для нее придется заводить два отдельных логина. Но большинство современных СУБД эту проблему решают либо членством в нескольких группах, либо множественными ролями. Так что если ты сумеешь адекватно отобразить структуру бизнес-прав своей фирмы на структуру прав-на-объекты в терминах своей СУБД, то ты вполне можешь использовать систему секюрити СУБД напрямую, без промежуточных (внешних) баз данных, таблиц с ролями или еще какими-то проверками. А проблемы хакеров и противодействия им это уже совершенно другие вопросы. Пихать имя-пароль в каждый action может быть вполне нормальным решением. Достаточно зашифровать их как-нибудь, чтобы хакер слушающий трафик между клиентом и сервером не смог понять что "вот это и был вожделенный пароль". Альтернативой пересылки имя-пароля каждый раз может быть пересылка какого-либо sessionid, но это потребует хранить список активных сессий на центральном сервере и естественно будет риск что некий хакер стащит базу с sessionid и вытащит оттуда имя-пароль. Опасность есть? Конечно есть. Можно ли зашифровать базу с sessionid? Конечно можно. Но ее и расшифровать тоже теоретически возможно... Есть еще третий путь: для авторизации отправлять юзера на специальный сайт, который будет делать всяческую параноидальную проверку на "кто тут пришел?", а потом возвращать управление твоему Главному Сайту и давать ему некий билетик который можно будет регулярно проверять у сервера авторизации, мол "ко мне пришел запрос от кого-то с такого-то ip, у него есть билет, пустить его?" и сервера авторизации будет отвечать "да это такой-то юзер, у него такие-то имя-пароль". Тогда хакеру придется влезать в процесс общения твоего http сервера и сервера авторизации чтобы узнать имя-пароль. А еще Хакер может прийти к МногоПравному Юзеру, приставить ему нож к горлу и сказать: дай свое имя-пароль. И тогда ты на веб-сайте уже никак не сможешь отличить Хакера от МногоПравного Юзера и настанет Армагеддон! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2014, 20:30 |
|
||
|
[YII] - Соединиться с БД тем именем и паролем, под которыми залогинился пользователь
|
|||
|---|---|---|---|
|
#18+
White Owl, про sessionid я чего-то не догнал. Ниразу такого подхода не видел, расскажи пожалуйста о чём речь идёт, о какой базе сессий. Может имелось ввиду обычный механизм сессий предоставляемый сервером? про отдельный сервер авторизации - тоже не понял. А чем поможет то, что авторизироваться пользователь будет на другом сервере? Из этой мысли имеет смысл только (по-моему) принудительная проверка по ip. Это усложнит задачу взломщика, так как ему кроме получения id сессии надо будет сделать запрос именно с ip адреса реального пользователя, с которого был произведён вход. То есть без явной уязвимости в клиентской части (в том числе в клиентском js) сделать ничего не получится (разве только заставить провайдера отрубить пользователя от сети и быстренько занять его адрес, вероятность чего стремится к нулю, так как это уже попахивает взломом системы провайдера). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2014, 10:20 |
|
||
|
[YII] - Соединиться с БД тем именем и паролем, под которыми залогинился пользователь
|
|||
|---|---|---|---|
|
#18+
ПрограмёрWhite Owl, про sessionid я чего-то не догнал. Ниразу такого подхода не видел, расскажи пожалуйста о чём речь идёт, о какой базе сессий. Может имелось ввиду обычный механизм сессий предоставляемый сервером?Когда сервер получает запрос от клиента и этот клиент представляется не при помощи пары имя-пароль, а при помощи sessionid. Как сервер узнает кто это такой пришел? По собственной базе сессий... И если целью хакера является узнать пару имя-пароль, то ему надо будет украсть эту базу сессий и расшифровать ее. ПрограмёрКстати, а пароль то в сессии точно хранить не надо (внимательно первое сообщение перечитал). Иначе опять же заполучив доступ к сессиям мне даже не надо будет ничего ломать... я просто в прямом виде стяну пароль и всё. :)Ну это не так уж просто на самом деле. В нормальных системах каждая sessionid проверяется сервером на источник (тот-же ip, тот же user-agent, иногда еще и тот-же набор кук). В чистом виде seesionid красть частенько бессмысленно. Програмёрпро отдельный сервер авторизации - тоже не понял. А чем поможет то, что авторизироваться пользователь будет на другом сервере?Двойная проверка источника. Бизнес сервер запоминает кого он отправил на сервер авторизации. Сервер авторизации убеждается что клиент к нему был отправлен из легального места. В смысле сервер авторизации знает что клиент может быть к нему прийти только от бизнес сервера и не примет случайных клиентов (http referer). После авторизации клиент перенаправляется обратно на бизнес сервер, который тоже проверяет referer и убеждается что билетик клиент получил именно на легальном сервере авторизации, и именно тот клиент которого он отправил авторизоваться не далее пяти минут назад. Вот этот обратный посыл сэмулировать снаружи сети не так-то просто. После этого бизнес сервер общается с сервером авторизации по полученному билету, и это общение уже идет обычно внутри LAN и вне досягаемости хакеров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2014, 21:43 |
|
||
|
[YII] - Соединиться с БД тем именем и паролем, под которыми залогинился пользователь
|
|||
|---|---|---|---|
|
#18+
Код: php 1. 2. Как варинат, напистаь своей компонент, унаследовався от CDbConnecition и при инициализации вызывать инициализацию компонента user и брать из него данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2014, 23:21 |
|
||
|
[YII] - Соединиться с БД тем именем и паролем, под которыми залогинился пользователь
|
|||
|---|---|---|---|
|
#18+
White OwlДвойная проверка источника. Бизнес сервер запоминает кого он отправил на сервер авторизации. Сервер авторизации убеждается что клиент к нему был отправлен из легального места. В смысле сервер авторизации знает что клиент может быть к нему прийти только от бизнес сервера и не примет случайных клиентов (http referer). После авторизации клиент перенаправляется обратно на бизнес сервер, который тоже проверяет referer и убеждается что билетик клиент получил именно на легальном сервере авторизации, и именно тот клиент которого он отправил авторизоваться не далее пяти минут назад. Вот этот обратный посыл сэмулировать снаружи сети не так-то просто. После этого бизнес сервер общается с сервером авторизации по полученному билету, и это общение уже идет обычно внутри LAN и вне досягаемости хакеров. Этот процесс ничем не отличается от перехода с одного скрипта на другой. Разница лишь в referer, который подделать ничего не стоит. То есть бизнес скрипт и скрипт авторизации - будет делать то же самое. Если и делать что-то подобное, то это должен быть сервер бизнес логики, на котором присутствует форма логина. Но получая данные логина и пароля он их отдаёт другому серверу, который соединяется с сервером sql и производит логин, отдавая назад данные пользователя. Тогда, что бы добраться до базы, надо взломать 3 сервера... Или найти уязвимость в скриптах. Понимаешь, сейчас сервера никто не ломает напрямую... Уровни защиты такие, что это сделать почти нереально (только с хреновым сис админом). Ломают именно скрипты (ищут в них уязвимости). А если скрипты будут взломаны, то подделать можно почти всё, что угодно (а тем более, если взломаны скрипты на клиенте, с которого достают нужные данные). Ну например, скорее всего на сайте будет функционал смены пароля или "забыли пароль" )) Взломав клиента, можно подделать эти запросы и поменять пароль, когда это надо будет. Вот и всё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2014, 10:55 |
|
||
|
|

start [/forum/topic.php?fid=23&msg=38688798&tid=1462638]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
50ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 239ms |
| total: | 374ms |

| 0 / 0 |
