Защищаем учетную запись администратора. 2.X

1976
Приветствую сообщников v
Пару дней назад думал над защитой пароля администратора, в общем то вариантов не много и все они стандартны - увеличиваем длину пароля, используем большой и маленький регистр букв, используем специальные символы.. Хорошо конечно.. Но не удобно.. Даже, если запомнить не сложно, то вводить каждый раз, гемор еще тот.. sick

Лень - двигатель прогресса, по крайней мере для меня (не, ну еще, конечно, двигатель прогресса ловить халяву с минимальными усилиями, хитрой смекалкой и минимальным кодом joke ), поэтому я подумал, а почему бы не придумать алгоритм для входа, известный только тебе, так сказать полиморфный пароль(если абстрагироваться от типов), или я уже где то видел эту идею, просто вспомнилось, не суть.. Идея хорошая, будем реализовывать popcorn



Самой простой в реализации, я посчитал, это добавление меняющегося кода в конец основного пароля администратора, в данном случае мы будем использовать показания минут на часах zst

Итого, если у вас пароль к примеру 'superadmin' , а время на ваших часах в правом нижнем углу 23:19, то вводить надо будет 'superadmin19', я думаю, ни чего сложного =))

При ошибке ввода минут в конце пароля, будем маскировать это, как ошибку ввода каптчи, что бы не делать лишних телодвижений в коде smoke

Итак, для этой цели нам нужно будет править контроллер авторизации:

/system/controllers/auth/actions/login.php

после кода
Код PHP:
  1.  
  2. if (cmsUser::sessionGet('is_auth_captcha') && $this->options['auth_captcha']){
  3. $is_captcha_valid = cmsEventsManager::hook('captcha_validate', $this->request);
  4. }
  5.  
вставляем
Код PHP:
  1.  
  2. if($is_captcha_valid){
  3. if($this->model->getUserIdForEmail($email) == 1){
  4. $is_captcha_valid = cmsEventsManager::hook('password_validate', $password);
  5. $password = cmsEventsManager::hook('password_original', $password);
  6. }
  7. }
  8.  

/system/controllers/auth/manifest.php

добавляем ключи
Код PHP:
  1.  
  2. 'password_validate'
  3. 'password_original'
  4.  
что бы получилось вот так
Код PHP:
  1.  
  2. return array(
  3. 'hooks' => array(
  4. 'user_profile_update',
  5. 'frontpage',
  6. 'frontpage_types',
  7. 'password_validate',
  8. 'password_original'
  9. )
  10. );
  11.  

/system/controllers/auth/model.php

добавляем метод
Код PHP:
  1.  
  2. public function getUserIdForEmail($email){
  3. $table_name = 'users';
  4. $field_name = 'email';
  5. $field_value = $email;
  6. $table_ar = array();
  7. $table_ar = $this->getItemByField($table_name, $field_name, $field_value);
  8. if(!empty($table_ar['id'])){
  9. return $table_ar['id'];
  10. }
  11. return false;
  12. }
  13.  
в папку /system/controllers/auth/hooks/

добавляем 2 файла из архива


Кому лень производить все эти манипуляции, создал архив который нужно распаковать в корень сайта с заменой файлов. ТОЛЬКО ДЛЯ ВЕРСИИ 2.7.1 !!!

ДЛЯ ВЕРСИИ InstantCMS 2.7.2 И ВЫШЕ

В версии 2.7.2 изменен механизм обработки событий, поэтому необходимо добавить их в админке:

Панель управления -> Компоненты -> Управление событиями

Защищаем учетную запись администратора.



ОЧЕНЬ ВАЖНО ! ДЕЛАЙТЕ ВСЕ МАНИПУЛЯЦИИ ТОЛЬКО НА КОПИИ РАБОТАЮЩЕГО САЙТА!!! ОТВЕТСТВЕННОСТЬ ЗА КРИВЫЕ РУКИ НЕСТИ НЕ БУДУ !



Так же, нужно проверить что ваше время в минутах совпадает со временем минут на сервере, для этого можно создать файл в корне сайта, например test_minute.php с кодом
Код PHP:
  1.  
  2. <?php
  3. echo '<div>' . date('i') . '</div>';
  4. ?>
  5.  
После этого выполнить этот файл, http://вашсайт/test_minute.php
Если минуты в выводе совпадают с выводом минут вашей системы, то все хорошо =)

ДАННЫЙ ХАК НЕ ИЗМЕНЯЕТ ВАШ ПАРОЛЬ АДМИНИСТРАТОРА, А ТОЛЬКО ДОБАВЛЯЕТ ФИШКУ АВТОРИЗАЦИИ!

По всем вопросам пишем сюда stuk или [email protected] для тех у кого нет регистрации

Всех благодарю за внимание v
Шифруемся =) | Социальный замок
Комментарии (14)
Алексей Тимофеев 23 февраля 2017 в 00:24 0
Привет! Все это отлично что вы пробуете себя в разработке+
А вот столько колобков в посте это перебор. С праздником!
oruchimaru 23 февраля 2017 в 00:35 +2
Здравствуйте. Пробовать себя в разработке перестал несколько лет назад, сейчас это основной вид зароботка. Колобки делают жизнь немного ярче, на то они и созданы stuk Вас тоже с праздником ! v
Sonat 23 февраля 2017 в 02:05 0
Первое что пришло в голову при виде


А разве при таком подходе мы не ломаем капчу?
Ведь результаты ее проверки теперь не важны... scratch
oruchimaru 23 февраля 2017 в 02:16 0
Отличное замечание ! Спасибо ! Сейчас выпущу багфикс, еще раз благодарю joke
oruchimaru 23 февраля 2017 в 02:28 0
Поправил, еще раз спасибо zst
Alexprofi 23 февраля 2017 в 03:20 0
А что, классная вещь, спасибо, может пригодиться!
Только если случится какой-то сбой по времени, то капец, - на сайт не зайдешь?
oruchimaru 23 февраля 2017 в 03:38 +1
Ни разу не встречал сбой по времени на сервере, намного больше вероятность не правильного отображения времени на клиентской машине, ну и у вас есть доступ к файлам, можно по ftp закоментить код .. =))
Alexprofi 23 февраля 2017 в 11:44 0
Я клиентский комп. и имел ввиду. Бывает при загрузке время сбивается.
Но выход действительно есть!
Alexneva 23 февраля 2017 в 14:12 +4
Хм, креативная идея.
Капитан 7 марта 2017 в 19:28 +1
Можно добавлять в конце не минуты, а часы. Исчезнет проблема не точных часов и удобство намного возрастет.
al955 21 марта 2017 в 21:27 0
а как сделать не минуты, а часы?
al955 21 марта 2017 в 21:44 0
lass onAuthPasswordValidate extends cmsAction {
public function run($password){
$hour = substr($password, -2);
if($hour == date('H')){
return true;
}
return false;
}
}
?>

Часы вместо минут
al955 9 апреля 2017 в 22:04 0
После обновления на 2.7.2 этот способ работает только, если включен режим отладки.
oruchimaru 28 апреля 2017 в 12:47 0
Панель управления -> Компоненты -> Управление событиями -> нажать кнопку "Обновить события в базе данных".