В большинстве систем управления сайтом такой функционал идет "из коробки". Не знаю, почему многоуважаемые творцы битрикса до сих пор не реализовали данный функционал в типовых механизмах, однако, очень часто может быть необходимо выполнять какие-то действия только при подтверждении действий текущим паролем (например, нужно изменить логин/пароль в личном кабинете). Для этого может пригодиться следующий алгоритм ...

В большинстве систем управления сайтом такой функционал идет "из коробки". Не знаю, почему многоуважаемые творцы битрикса до сих пор не реализовали данный функционал в типовых механизмах, однако, очень часто может быть необходимо выполнять какие-то действия только при подтверждении действий текущим паролем (например, нужно изменить логин/пароль в личном кабинете). Для этого может пригодиться следующий алгоритм ...

Рассмотрим алгоритм на примере изменения пароля. Пусть пост-запросом в наш обработчик пришли параметры: 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();
Количество показов: 3665
02.02.2016


Реклама: ООО 'РЕГ.РУ Домены Хостинг'. ИНН 6312068502. ERID: CQH36pWzJqCRJ4UXaHSnYxUB4bq5fyuvNiq5y4geRNH7vF
Реклама: ООО 'КвикСофт'. ИНН 7734706120. ERID: CQH36pWzJqCRJ4UXKvMNSFqMsX7dYBaPEMRX5odpmNzefp

Разработка сайта

Подайте заявку на разработку сайта на базе готового решения от компании 1С-Битрикс или одного из партнеров компании. Максимально подробно опишите, чему будет посвящен сайт, если это интернет-магазин - что он будет продавать, нужна ли мультиязычность, будут ли разные типы цен (розница, опт, крупный опт), будет ли интеграция с 1С, будет ли выгрузка товаров на различные торговые площадки...

Сопровождение сайта

Вы можете подать заявку на сопровождение вашего сайта на базе 1С-Битрикс. Сопровождение включает в себя: проверка актуальности обновлений сайта, проверка актуальности резервной копии, консультации по сайту. Опишите в заявке, какие еще объемы планируются на сопровождении и на какой срок вы планируете заключить договор на сопровождение - мы подберем подходящий вам бюджет на сопровождение

Работы по сайту

Вы можете подать заявку на выполнение определенного объема работ по сайту. Опишите в заявке объем работ. Это может быть разработка какого-то нового функционала, доработки по имеющемуся функционалу, доработки под требования сео-специалистов. На основании заявки вам будет сформирован бюджет работ, а также названы сроки на выполнение тех или иных работ.