[Office] 1.7.0 - улучшение безопасности

Привет, друзья!

Вдохновение от недавней MODXpo еще не прошло, зато появились сообщения о целенаправленной атаке на сайты с установленным дополнение Office.

Суть в том, что какие-то нехорошие люди шлют запросы напрямую на ajax коннектор с указанием email по списку и спамерским сообщением в пароле. Так как Office по умолчанию отправляет пароль и люди видят этот спам от имени сайта.

Сообщения такие появились пару дней назад, и должен признать, это очень остроумный способ рассылки.

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

Во-первых, если пользователь указал в форме регистрации свой пароль (или спамерское сообщение), на почте он его не увидит. И правда, зачем это нужно, если он сам его указал — он же его знает, верно?

Автоматически сгенерированные пароли будут приходить, как и прежде. Не забудьте обновить чанк tpl.Office.auth.register, чтобы красиво прятать блок с паролем, при его отсутствии!

Во-вторых, я встроил CSRF токены, которые давно и успешно работают на modhost/modstore. Суть в том, что при отправке формы добавляется еще поле csrf со случайным кодом, который сравнивается со значением в сессии пользователя.

Отсюда 3 вывода:
— У юзера вообще должна быть сессия между запросами. Для робота это означает необходимость приёма и отправки сессионной куки.
— Юзер должен открыть страницу с формой входа, чтобы получить текущее значение csrf токена, просто долбиться на коннектор больше не выйдет.
— А после регистрации пользователя и сброса пароля, токен генерируется заново — так что нужно снова открыть страницу входа.

Конечно, можно написать робота, который будет соблюдать все эти правила, но это уже гораздо сложнее, чем просто слать POST запросы. А учитывая отключенную возможность отправить свой текст вместо пароля — и вовсе, бессмысленно.



Как мне кажется, заодно решается и вопрос с капчей, которую многие хотят встроить для защиты — CSRF должен помочь и с этим.

Если вдруг, по какой-то причине, новая функция вам помешает — её можно отключить системной настройкой office_check_csrf. Так что, друзья, срочно обновляем все свои сайты и радуемся!

Кстати, вот заметка от Володи, как почистить левые аккаунты.
Василий Наумкин
17 ноября 2017, 15:21
modx.pro
5
5 088
+12

Комментарии: 29

Василий Столейков
17 ноября 2017, 18:21
1
0
Спасибо большое за оперативность!
А то сегодня уже 1000 пустых регистраций было…
Fducho Santos
17 ноября 2017, 18:29
0
Спасибо за оперативность, Василий!
    Кирилл
    22 ноября 2017, 11:31
    0
    Василий, приветствую!
    Спасибо за обновление. Однако, есть один момент.
    На одном из проектов используется регистрация по номеру телефона. При первой попытке отправить форму, если не было ошибок в форме регистрации, все отлично, токен проходит проверку. Однако, если ввести код подтверждения из смс, и попробовать отправить, возникает ошибка токена. Поэтому пришлось отключить эту функцию через системные настройки.
      Василий Наумкин
      22 ноября 2017, 12:15
      +1
      Да, об этом я не подумал.

      Поправил, обновляйся и проверяй.
        Кирилл
        22 ноября 2017, 12:23
        0
        Спасибо, теперь все отлично!
      Эрадж Шамс
      22 ноября 2017, 15:33
      0
      Вечер добрый. Спасибо за обновление. Спама нет. Только теперь не приходят письма с подтверждением регистрации. Сначала думал, что с почтой на сервере что-то не так, потом и так и сяк переменял email адреса ms2_email_manager и emailsender. Все тщетно. Не знаю куда копать.
        Василий Наумкин
        22 ноября 2017, 15:35
        0
        Не думаю, что это как-то может быть связано в обновлением.

        Пиши в поддержку магазина, оставляй адрес админки, логин и пароль — будем проверять, в чём дело.
      Константин Ильин
      28 ноября 2017, 18:50
      0
      Доброго времени суток!
      Подскажите пожалуйста пару моментов как правильней делать и где копать

      1. Создал контроллер auth2.class.php, поправил formRegister, проверял некоторые поля из формы, например проверку ссылки Вк:
      // Check vk
      $vk = trim(@$data['vk']);
      if (!empty($vk)) {
          if (!preg_match('/https?:\/\/(www\.)?vk\.com\/([^\/].+)/', $vk)) {
              return $this->error($this->modx->lexicon('Неверная ссылка на ВКонтакте'));
          } 
      }else{
          return $this->error('Вы не указали ссылку на ВКонтакте!');
      }
      После передаю в функцию $this->_createUser(), в ней доже передаю в массив

      Правильно ли так проверять поля из формы?

      2. Нужно же удалять старый контроллер контроллер auth.class.php?
      т.к. я в инспекторе кода поменяю с auth2/formRegister на auth/formRegister и спокойно зарегистрируюсь с помощью email, без обязательных полей

      3. Есть ли js колбеки, например мне после того как регистрация прошла и jGlow высвечивает сообщение о том что мне выслана ссылка, мне нужно закрывать модальное окно регистрации и открывать другое окно более информативное чем jGlow.
      Или придется копировать /assets/components/office/js/auth/default.js и переписывать?

      4. Так же еще небольшой вопрос, при отправке не присваивается класс error для input если они не прошли проверку, как бы хочется выделять красным input. Тут я полагаю переписывать надо auth2.class.php и default.js.
      В auth2.class.php для функции error дополнительно передавать массив и название поля с ошибкой
      $this->error('Ошибка поля VK', array('err' => 'vk'));
      После отлавливать в js и присваивать класс

      В ajaxForm все проще конечно было со 2 и 3 пунктом :)
        Константин Ильин
        28 ноября 2017, 19:01
        0
        перепутал
        В ajaxForm все проще конечно было со 3 и 4 пунктом :)
          Константин Ильин
          30 ноября 2017, 09:09
          0
          Люди добрые подскажите как надо программировать :))
          1 и 2-ой пункт, сделал так же как описал выше.
            Василий Наумкин
            30 ноября 2017, 10:14
            1
            0
            Вопросы по платным дополнениям принимаются в поддержке магазина.
          Семён Кудрявцев
          04 декабря 2017, 16:23
          0
          «Конечно, можно написать робота, который будет соблюдать все эти правила, но это уже гораздо сложнее, чем просто слать POST запросы........»
          Обновился я до последней версии и решил рассказать одному своему знакомому php-программисту мол
          смотри какая штука должна защитить от регистрации левых аккаунтов. На что мне он через 5 минут прислал файл в 45 строчек кода — который за секунду 100 аккаунтов регистрирует несмотря на csrf токкены.
          Просто два последовательных запроса через curl на форму регистрации, первым получает её, вторым отправляет.
          Конечно, следует сказать, что для максимального удобства пользователей капча на сайте не используется.
          Так что на счёт большой сложности написания подобного робота я не совсем уверен, но за дополнительную защиту, конечно, спасибо автору.
            Василий Наумкин
            04 декабря 2017, 16:30
            0
            Это замечательно, только какой смысл их регистрировать, если спам сообщение в письме больше не отправляется?

            Если проблема будет повторяться — придумаем что-нибудь еще, а пока лично мне не хочется бесить людей каптчами.
              Семён Кудрявцев
              04 декабря 2017, 16:58
              0
              На счёт капч полностью согласен. А по поводу левых аккаунтов, хочу подождать немного и посмотреть много ли таких инициативных найдётся, кто решится обходные пути искать. Может оно и не зачем будет с капчами морочиться.
                Сергей Шлоков
                04 декабря 2017, 17:18
                0
                Тем более, что Гугл каптчи вообще не напрягают.
            Pavel
            12 декабря 2017, 12:55
            0
            Здравствуйте. Планирую купить последний Office. Будет ли он совместим с Minishop 2.2, который установлен на сайте?
            Константин Ильин
            18 января 2018, 09:40
            0
            Василий, подскажи где этот глюченный лексикон найти?

            joxi.ru/zANpLRJsBkQ6Gm

            'brЭто поле не должно быть пустым'

            Разобрался, что из-за плагина и в контроллере
            // Check vk
            $vk = trim($_POST['vk']);
            if (!empty($vk)) {
                if (!preg_match('/https?:\/\/(www\.)?vk\.com\/([^\/].+)/', $vk)) {
                    $modx->error->addField('vk', 'Неверная ссылка на ВКонтакте.');
                    $modx->event->output('Неверная ссылка на ВКонтакте.');
                } 
            }else{
                $modx->error->addField('vk', 'Это поле не должно быть пустым.');
                $modx->event->output('Вы не указали ссылку на ВКонтакте!');
            }
            за счет addField добавляется br

            пофиксить это можно:

            protected function _formatProcessorErrors(modProcessorResponse $response, $glue = 'br')
            {
            ****
            }
            //заменив $glue = '< br >' - без пробелов
            
            protected function _formatProcessorErrors(modProcessorResponse $response, $glue = '< br >')
            {
            ****
            }
              Константин Ильин
              18 января 2018, 10:15
              0
              Один вопрос только остался
              Как сделать так чтобы output не писал в журнал ошибок
              $modx->event->output('')
              Sergey (Sentinel)
              29 сентября 2020, 08:56
              0
              У office вместо логина можно войти с телефоном? Просто мне пишет пользователь не найден, хотя телефон в mobilephone есть…
                Александр Мельник
                29 сентября 2020, 09:30
                0
                Не пользовался Office но думаю что нет — в modx можно авторизоваться только по логину, по другим полям — нет. Ну и плюс, поле телефон — не уникально и ничего не мешает иметь две анкеты с одним номером, как тогда авторизоваться?
                  Pavel Zarubin
                  29 сентября 2020, 11:58
                  +1
                  Ну вообще то авторизовать пользователя можно по чему угодно, хоть по имени, да и сделать поле телефона уникальным тоже труда не составит, я уже молчу что можно не делая его уникальным просто на событие добавить ручную проверку уникальности, код древний как говно мамонта, да и не везде правильный, но вот пример абсолютно кастомной авторизации с регистрацией по любому полю github.com/pavel-one/modxCustomAuth
                    Александр Мельник
                    29 сентября 2020, 12:43
                    0
                    Ну это в случае кастомной авторизации конечно можно. Я обычно пишу для каждого сайта свою систему авторизации, поэтому там да — логику строю как мне нужно. А разве office позволяет авторизоваться по любому полю?
                      Pavel Zarubin
                      29 сентября 2020, 12:46
                      0
                      Унаследовав процессор, и поменяв пару строк почему нет?
                        Александр Мельник
                        29 сентября 2020, 13:05
                        0
                        верно верно, но все равно это кастомизация. Я так понимаю Сергей спрашивал за работу из «коробки».
                    Sergey (Sentinel)
                    29 сентября 2020, 12:30
                    0
                    В office есть возможность авторизации по телефону так же, переключив системную настройку.
                    Хотел узнать, может можно, если включена авторизация по email, то номер телефона тоже бы мог использоваться как логин?
                  Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                  29