Сегодня после установки двух новых сайтов, столкнулся с проблемой: при настройки обмена (самописный) с 1С, обмен не стартовал, журнал обмена 1С при проверке соединения выдавал ошибку - "Произошла ошибка авторизации".
Проверка авторизации происходила следующим образом:
Сразу для пояснения
API Битрикса не использовалось, т.к. не покрывало все потребности. Например $USERcheck->Login()возвращает true или false и не понятно, что ввел пользователь не так логин или пароль? Или же если кто то авторизован под пользователем и под ним идет проверка функцией она всегда будет возвращать true.
Что удалось выяснить
Первым делом необходимо было выяснить, какие критические изменения были в релизе, обратившись к , было найдено следующее изменение:
Таким образом необходимо было переписать функцию. Вот обновленная функция, для последней версии Битрикс:
Кому интересно, как формируется пароль и записывается в БД Битрикс, можно посмотреть теперь тут:
Проверка авторизации происходила следующим образом:
- Из 1С приходили данные пользователя (логин/пароль) в открытом виде.
- Пользователь (админ для обмена), был записан в системной таблице "Список пользователей" (b_user).
- Для того, чтобы проверить данные (сравнить логин/пароль), необходимо было получить MD5-хеш от пароля.
//Проверяем, является ли $password текущим паролем пользователя.
function isUserPassword($userId, $password)
{
$userData = CUser::GetByID($userId)->Fetch();
$salt = substr($userData['PASSWORD'], 0, (strlen($userData['PASSWORD']) - 32));
$realPassword = substr($userData['PASSWORD'], -32);
$password = md5($salt.$password);
return ($password == $realPassword);
} |
Сразу для пояснения
API Битрикса не использовалось, т.к. не покрывало все потребности. Например $USERcheck->Login()возвращает true или false и не понятно, что ввел пользователь не так логин или пароль? Или же если кто то авторизован под пользователем и под ним идет проверка функцией она всегда будет возвращать true.
Что удалось выяснить
Первым делом необходимо было выяснить, какие критические изменения были в релизе, обратившись к , было найдено следующее изменение:
| v20.5.400 2020-07-24 Пароли пользователей теперь хешируются по алгоритму SHA-512. |
Таким образом необходимо было переписать функцию. Вот обновленная функция, для последней версии Битрикс:
//проверяем, является ли $password текущим паролем пользователя
function isUserPassword($userId, $password){
$userData = CUser::GetByID($userId)->Fetch();
$salt = substr($userData['PASSWORD'], 3, 16);
$password = crypt($password, '$6$'.$salt.'$');
return ($password == $userData['PASSWORD']);
}
|
/bitrix/modules/main/lib/security/password.php
Раньше формирование пароля было тут:
/bitrix/modules/main/classes/mysqluser.php
Надеюсь это будет кому то полезно.