В большинстве систем управления сайтом такой функционал идет "из коробки". Не знаю, почему многоуважаемые творцы битрикса до сих пор не реализовали данный функционал в типовых механизмах, однако, очень часто может быть необходимо выполнять какие-то действия только при подтверждении действий текущим паролем (например, нужно изменить логин/пароль в личном кабинете). Для этого может пригодиться следующий алгоритм ...
В большинстве систем управления сайтом такой функционал идет "из коробки". Не знаю, почему многоуважаемые творцы битрикса до сих пор не реализовали данный функционал в типовых механизмах, однако, очень часто может быть необходимо выполнять какие-то действия только при подтверждении действий текущим паролем (например, нужно изменить логин/пароль в личном кабинете). Для этого может пригодиться следующий алгоритм ...
Рассмотрим алгоритм на примере изменения пароля. Пусть пост-запросом в наш обработчик пришли параметры: PASSWORD - введенный пользователем текущий пароль, NEW_PASSWORD - введенный пользователем новый пароль и CONFIRM_NEW_PASSWORD - подтверждение нового пароля пользователя. Тогда, получам алгоритма:
$arUser["PASSWORD"] = $USER->GetParam("PASSWORD_HASH"); $arParams["PASSWORD"] = $_POST['PASSWORD']; $arParams["NEW_PASSWORD"] = $_POST['NEW_PASSWORD']; $arParams["NEW_PASSWORD_CONFIRM"] = $_POST['CONFIRM_NEW_PASSWORD']; if (strlen($arUser["PASSWORD"]) > 32) { $salt = substr($arUser["PASSWORD"], 0, strlen($arUser["PASSWORD"]) - 32); $db_password = substr($arUser["PASSWORD"], -32); } else { $salt = ""; $db_password = $arUser["PASSWORD"]; } $user_password = md5($salt . $arParams["PASSWORD"]); if ($user_password == $db_password || $arParams["NEW_PASSWORD"] !== $arParams["NEW_PASSWORD_CONFIRM"]){ $user = new CUser; $fields = Array( "PASSWORD" => $arParams["NEW_PASSWORD"], "CONFIRM_PASSWORD" => $arParams["NEW_PASSWORD_CONFIRM"], ); $user->Update($USER->GetID(), $fields); if (strlen($user->LAST_ERROR) > 0) { ShowError($user->LAST_ERROR); } else { ShowNote('Пароль изменен'); } ?> }else{ ShowError('Не верный текущий пароль'); }
Сначала получаем хещ пароля текущего пользователя. Далее отделяем от хеша пароля добавленную "соль". Потом шифруем введенный пользователем пароль вместе с добавленной к нему солью и сверяем полученный хеш с тем, что хранится в базе.
Если пароли сходятся - пробуем обновить пароль, если же нет - выводим соответствующее предупреждение.
Update 2024-10-23
Чтобы получить хеш-пароля в формате ядра D7 можно воспользоваться такой конструкцией:
$q = new \Bitrix\Main\ORM\Query\Query(\Bitrix\Main\UserTable::getEntity()); $q->enablePrivateFields(); $q->setSelect([ 'ID' => 'ID', 'LOGIN' => 'LOGIN', 'PASSWORD' => 'PASSWORD', ]); $q->setFilter([ '=ID' => \Bitrix\Main\Engine\CurrentUser::get()->getId(), ]); $result = $q->fetch();
Разработка сайта
Подайте заявку на разработку сайта на базе готового решения от компании 1С-Битрикс или одного из партнеров компании. Максимально подробно опишите, чему будет посвящен сайт, если это интернет-магазин - что он будет продавать, нужна ли мультиязычность, будут ли разные типы цен (розница, опт, крупный опт), будет ли интеграция с 1С, будет ли выгрузка товаров на различные торговые площадки...
Сопровождение сайта
Вы можете подать заявку на сопровождение вашего сайта на базе 1С-Битрикс. Сопровождение включает в себя: проверка актуальности обновлений сайта, проверка актуальности резервной копии, консультации по сайту. Опишите в заявке, какие еще объемы планируются на сопровождении и на какой срок вы планируете заключить договор на сопровождение - мы подберем подходящий вам бюджет на сопровождение
Работы по сайту
Вы можете подать заявку на выполнение определенного объема работ по сайту. Опишите в заявке объем работ. Это может быть разработка какого-то нового функционала, доработки по имеющемуся функционалу, доработки под требования сео-специалистов. На основании заявки вам будет сформирован бюджет работ, а также названы сроки на выполнение тех или иных работ.