Проблем при Update зашифрованного пароля!

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
ynik
Сообщения: 124
Зарегистрирован: 2010.05.05, 13:07
Откуда: Ukraine

Проблем при Update зашифрованного пароля!

Сообщение ynik »

Перед тем как создать тему, подумал как решить но видимо думалка слабовата :) , поиск ничего не дал, странно канешно ведь по идее в каждом блоге подобное нужно решать, выходит что один я такой непонятный.
Имею одну модель manageUsers и в views create ->_create_form и update -> _update_form, соотвественно две формы используют одну модель, в моделе перед сейвом функцией beforeSave пароль заганяю в md5, проблем с create нету, а вот при update
Когда мы редактируем например Имя, при сохранении зашифрованый пароль шыфруеться еще раз, и будем совсем новый пероль не извесный юзеру, в принцыпе никому.
Самым оптимальным вариантом было бы в форму update_form в поле пароля не возвращать значение из БД пароля, при сохранении update его не трогало, и при вводе нового пароля перезаписывался, с Бд заполняетьс к полю пароля value="" пытался задать $form->passwordField($model, $value=' ', 'password'); выдает ошибку. коротче запутался, или я неправильным путем иду, надеюсь понятно изложил проблему, прошу совета! кто как решает подобные вопросы?
Последний раз редактировалось ynik 2010.05.30, 16:56, всего редактировалось 1 раз.
ynik
Сообщения: 124
Зарегистрирован: 2010.05.05, 13:07
Откуда: Ukraine

Re: Проблем при Update зашифрованного пароля!

Сообщение ynik »

по ходу доследил что для update возвращает значения вот эта функция

Код: Выделить всё

public function loadModel()
    {
        if($this->_model===null)
        {
            if(isset($_GET['id']))
                $this->_model=Manage_users::model()->findbyPk($_GET['id']);
            if($this->_model===null)
                throw new CHttpException(404,'The requested page does not exist.');
        }
        return $this->_model;
    } 
вот согласно айди взятого с $_GET, делаеться выборка с БД, и заполняються поля если не пустые, нужно наверно в findbyPk задать условие, нужно выполнить типа

Код: Выделить всё

"SELECT username, email, first_name, last_name FROM `user` WHERE `id`='". $_GET['id'] ."'" 
может через другой find. Как правильно и грамотно составить запрос через find и какой , или же как же исключить поле пароля вопрос тогда конкретнее
AbS_
Сообщения: 207
Зарегистрирован: 2010.03.27, 14:02

Re: Проблем при Update зашифрованного пароля!

Сообщение AbS_ »

Я бы просто убрал хеширования пароля из метода beforeSave();
Т.к. его хеширования нужно всего в двух случаях:
1) Создании нового пользователя
2) Смена пароля

А так даже если не загрузить пароль из БД, и оставить поле пустым, то в БД будет все равно писать не пойми что. Тут надо решить проблему когда писать поле "пароль" в БД, а когда не писать...
vlastachu
Сообщения: 50
Зарегистрирован: 2010.03.01, 20:15

Re: Проблем при Update зашифрованного пароля!

Сообщение vlastachu »

Вставь в beforesave() проверку if($this->isNewRecord) чтобы пароль дважды не шифровался.
ynik
Сообщения: 124
Зарегистрирован: 2010.05.05, 13:07
Откуда: Ukraine

Re: Проблем при Update зашифрованного пароля!

Сообщение ynik »

beforeSave(); у меня один на create и update, значит если мы создаем и редактируем он будет хешироваться, уберем его с update не будет при создании, и смене пароля.
А так даже если не загрузить пароль из БД, и оставить поле пустым, то в БД будет все равно писать не пойми что.
немного не понял но если мы в update не выводим у нас чистое поле, в беде у нас пароль 123456 в зашифрованом виде, при update он не перезаписываеться, если ввели новый пароль хешируеться и переписываеться, я так понимаю это дело
ynik
Сообщения: 124
Зарегистрирован: 2010.05.05, 13:07
Откуда: Ukraine

Re: Проблем при Update зашифрованного пароля!

Сообщение ynik »

vlastachu писал(а):Вставь в beforesave() проверку if($this->isNewRecord) чтобы пароль дважды не шифровался.
vlastachu
if($this->isNewRecord) он работает не переписываеться, при изменении других полей, но когда меняем пароль на другой все он не хешируеться, а так прямиым текстом в БД и летит что не есть гуд
AbS_
Сообщения: 207
Зарегистрирован: 2010.03.27, 14:02

Re: Проблем при Update зашифрованного пароля!

Сообщение AbS_ »

ynik писал(а):beforeSave(); у меня один на create и update, значит если мы создаем и редактируем он будет хешироваться, уберем его с update не будет при создании, и смене пароля.
А так даже если не загрузить пароль из БД, и оставить поле пустым, то в БД будет все равно писать не пойми что.
немного не понял но если мы в update не выводим у нас чистое поле, в беде у нас пароль 123456 в зашифрованом виде, при update он не перезаписываеться, если ввели новый пароль хешируеться и переписываеться, я так понимаю это дело
Ну а что не понятного? Оставите поле пустым, в БД запишется хешь от пустого поля.
ynik
Сообщения: 124
Зарегистрирован: 2010.05.05, 13:07
Откуда: Ukraine

Re: Проблем при Update зашифрованного пароля!

Сообщение ynik »

AbS а понял с поля вычитать данные не выход.
тогда пытаюсь переделать фунцию beforesave по ходу там нужно сверить введен ли новый пароль если да то шифровать если нет не трогать
Последний раз редактировалось ynik 2010.05.30, 21:10, всего редактировалось 1 раз.
AbS_
Сообщения: 207
Зарегистрирован: 2010.03.27, 14:02

Re: Проблем при Update зашифрованного пароля!

Сообщение AbS_ »

ynik писал(а):AbS а понял.
тогда пытаюсь переделать фунцию beforesave по ходу там нужно сверить введен ли новый пароль если да то шифровать если нет не трогать
А как в таком случае поступать при Изменение пароля?
имхо БефоСейф() не то место где следует шифровать пароль.
ynik
Сообщения: 124
Зарегистрирован: 2010.05.05, 13:07
Откуда: Ukraine

Re: Проблем при Update зашифрованного пароля!

Сообщение ynik »

а где его тогда шифровать перед сейвом в экшене контроллера разве что, но если б это решало мою проблемму, в даном случае я не знаю как ее решить не там ни там не выходит, наверно надо отойти немного от компа мож мысля придет
vlastachu
Сообщения: 50
Зарегистрирован: 2010.03.01, 20:15

Re: Проблем при Update зашифрованного пароля!

Сообщение vlastachu »

Хм. Я просто думал, что вам не надо менять пароль. (что кстати нормально - пользователи в основном меняют пароли на частопосещаемых сайтах вроде соц. сетей)

Для смены пароля лучше сделать отдельную форму, а то в update пользователь увидит зашифрованный пароль, что может привести его в когнитивный диссонанс.
Или поискать как расшифровывать md5 с солями (я кстати как-то не находил...).
ynik
Сообщения: 124
Зарегистрирован: 2010.05.05, 13:07
Откуда: Ukraine

Re: Проблем при Update зашифрованного пароля!

Сообщение ynik »

я вот думаю вот так бы сделать в бефоре сейв
по другому уже даже не знаю как можно придумать.

Код: Выделить всё

public function beforeSave()
        {               
            if($this->password !== 'bbc345e31396a86ed174c4ac40117813')//код сдесь пароль в хеше его бы узнать и подставлять
                    {
                $salt = self::randomSalt();
                $this->password = self::hashPassword($this->password, $salt);
                $this->salt = $salt;
            }else{
            if($this->isNewRecord)
                  {
                $salt = self::randomSalt();
                $this->password = self::hashPassword($this->password, $salt);
                $this->salt = $salt;
               }
            }
             return true;
        } 
вот что то типа этого работает, пароль юзера с БД вручну сдесь втыкнул для проверки будет ли работать так , его бы как то вытянуть, к редактируемому юзеру.
при таком раскладе создаеться новый , редактируэться другие поля и пароль если равно паролю в Бд не трогаеться, если не равно паролю в Бд выполняеться первый блок и хешируеться новый пароль, вопрос узнать пароль юзера который редактируеться?
канешно это все в моделе делать по мойму не то, а по другому даже не знаю.
Но все ж таки поле пустое было бы лутше при редактировании, тогда сделать проверку типа как вверху что если оно пустое то не шифровать ниче, и не надо доставать с Бд для сопоставления паролей, раз так и пустые поля тоже шифруються, но как? :mrgreen:
vlastachu
Сообщения: 50
Зарегистрирован: 2010.03.01, 20:15

Re: Проблем при Update зашифрованного пароля!

Сообщение vlastachu »

Почему бы в условии не воспользоваться "||" ?
А насчёт проверки, то тут не сложно: просто каждому аттрибут у таблицы присвоить соответствующее значение, а пароль проверить отдельно.
Вроде
$data->row1 = $_POST['data']['row1']
...
if($data->password !== $_POST['data']['password'])
{...}

Дальше извиняюсь не читал - поздно уже)
AbS_
Сообщения: 207
Зарегистрирован: 2010.03.27, 14:02

Re: Проблем при Update зашифрованного пароля!

Сообщение AbS_ »

vlastachu писал(а):Почему бы в условии не воспользоваться "||" ?
А насчёт проверки, то тут не сложно: просто каждому аттрибут у таблицы присвоить соответствующее значение, а пароль проверить отдельно.
Вроде
$data->row1 = $_POST['data']['row1']
...
if($data->password !== $_POST['data']['password'])
{...}

Дальше извиняюсь не читал - поздно уже)
Потому что так ни кто не делает.
Читайте про безопасное присвоение, попробуйте создать разные сценарии.
vlastachu
Сообщения: 50
Зарегистрирован: 2010.03.01, 20:15

Re: Проблем при Update зашифрованного пароля!

Сообщение vlastachu »

эмм...А когда я делаю $data->attributes = $_POST['data'];
Что-то от этого меняется? та же валидация проходит, те же проверки. Просто я сказал все аттрибуты по отдельности присвоить, а пароль перед присвоением проверить.
AbS_
Сообщения: 207
Зарегистрирован: 2010.03.27, 14:02

Re: Проблем при Update зашифрованного пароля!

Сообщение AbS_ »

vlastachu писал(а):эмм...А когда я делаю $data->attributes = $_POST['data'];
Что-то от этого меняется? та же валидация проходит, те же проверки. Просто я сказал все аттрибуты по отдельности присвоить, а пароль перед присвоением проверить.
При присвоение атрибутов проверка правил не проходит.
ynik
Сообщения: 124
Зарегистрирован: 2010.05.05, 13:07
Откуда: Ukraine

Re: Проблем при Update зашифрованного пароля!

Сообщение ynik »

Код: Выделить всё

Почему бы в условии не воспользоваться "||" ? 
можно канешно но не в этом суть проблеммы.
Так что кто то поможет создать запрос к Бд через find, чтоб исключить возврат на поле пароля, для update а там как писал выше проверку на пустоту , и всех делов.
Аватара пользователя
alexzv
Сообщения: 120
Зарегистрирован: 2010.04.23, 00:10
Откуда: Украина, Киев

Re: Проблем при Update зашифрованного пароля!

Сообщение alexzv »

По моему ничего сложного тут нет, у себя делал подобным образом (предположим таблица называется User):

1. Добавляем в view

Код: Выделить всё

echo CHtml::hiddenField('User[oldpassword]',$model->password); 
2. Дальше в контроллер (в actionUpdate)

Код: Выделить всё

$model->attributes=$_POST['User'];
$model->oldpassword = $_POST['User']['oldpassword'];
 
3. Ну и в модель

Код: Выделить всё

public $oldpassword;

protected function beforeSave()
{
    if($this->isNewRecord || (!empty($this->oldpassword) && $this->oldpassword!=$this->password))
        $this->password = md5($this->password);
    return true;
}
 
ynik
Сообщения: 124
Зарегистрирован: 2010.05.05, 13:07
Откуда: Ukraine

Re: Проблем при Update зашифрованного пароля!

Сообщение ynik »

ну как вариант с использованием hiddenField, но у меня что то не шифрует пароль Ваш вариант при его замене, где то в CHtml::hiddenField('Manage_users[oldpassword]',$model->password); $model->password не присваеваеться oldpassword, и он пустой не дает false (!empty($this->oldpassword) && $this->oldpassword!==$this->password) в бефоре сейв
AbS_
Сообщения: 207
Зарегистрирован: 2010.03.27, 14:02

Re: Проблем при Update зашифрованного пароля!

Сообщение AbS_ »

Зачем пароль на сторону клиента посылать?
Ответить