Безопасность
Вы собираетесь доверить нам выставление счетов, данные ваших гостей и адреса ваших клиентов. Эта страница говорит о том, что сделано, а в конце — о том, чего не хватает, потому что второй список расскажет о нас больше, чем первый.
Изоляция
Большинство платформ помещают всех клиентов в одни и те же таблицы и разделяют их по столбцу. Достаточно одного запроса, написанного впопыхах и без фильтра, чтобы один клиент увидел данные другого. Здесь такому запросу нечего искать.
Как обычно
WHERE tenant_id = ?
Все клиенты в одних и тех же таблицах. Разделение — это фильтр, который кто-то должен не забыть написать в каждом запросе, всегда. Достаточно забыть один раз.
Здесь
USE ajja_tenant_…
Каждый клиент в своей собственной базе данных. Запрос без фильтра всё равно возвращает только ваше, потому что соединение было направлено на вашу сторону ещё до того, как запрос появился.
ajja_tenant_<slug>
DROP DATABASE
кто вы · на что подписаны · какие модули
Учётные записи и доступ
Каждая из этих проверок выполняется на сервере. Ни одна из них не зависит от того, что браузер решит показать или скрыть.
Двухфакторная аутентификация с помощью приложения, которым вы уже пользуетесь. Секрет начинает действовать только после того, как вы подтвердите код, сгенерированный по нему, чтобы никто не оказался заблокирован из-за неверно считанного QR-кода. Вы получаете 8 кодов восстановления, и они, и секрет хранятся в базе данных в зашифрованном виде.
Между верным паролем и кодом с телефона существует временный билет, который действует пять минут. По истечении этого времени вы начинаете заново — полуоткрытого входа, который ждёт, не остаётся.
Вход ограничивается одновременно по email и по адресу: пять попыток в минуту для одной и той же пары, двадцать в минуту для одного и того же адреса. Если считать только email, посторонний мог бы заблокировать вам учётную запись, намеренно ошибаясь. Двухфакторная проверка, регистрация и публичные формы регистрации заезда и бронирования тоже ограничены. Аутентифицированный API ограничен 120 запросами в минуту на пользователя, а не на адрес — два коллеги в одном офисе не делят между собой лимит.
Скрыть пункт меню — это не безопасность. Каждый адрес проходит две отдельные проверки — модуль активен у этого клиента, и ваша роль видит этот модуль — и отвечает 403 даже тому, кто вводит адрес вручную.
Действительный токен, направленный на имя другого клиента, ничего не читает. А ответ — 404, а не 403: тот, кто подбирает имена клиентов, не узнаёт, какие из них существуют.
Гость и владелец входят по ссылке с собственным ключом, который открывает что-то одно и может иметь срок действия. Нет учётной записи, которую у них можно украсть, и пароля, который они использовали бы в другом месте.
Один запрос, от начала до конца
Вот что происходит между нажатием кнопки и появлением результата. Порядок зафиксирован при запуске приложения, а не оставлен на усмотрение того, как был написан каждый маршрут, — потому что проверка, выполненная слишком поздно, уже позволила запросу начать работу.
Собственный домен, поддомен или заголовок запроса указывают, какому клиенту принадлежит запрос. Имя неизвестно — на этом всё заканчивается.
Приостановленное рабочее пространство не обслуживается, даже для чтения.
Соединение с базой данных переключается на базу этого клиента. Всё, что идёт дальше, включая ошибки, может затронуть только эту сторону.
Токен проверяется. Без действительного токена пятого шага не будет.
120 в минуту, считается на пользователя. Сверх этого сервер говорит «хватит».
Пользователь токена и клиент запроса должны совпадать. Именно эта связка не позволяет легитимному токену читать соседний дом.
Модуль должен быть активен у клиента и виден вашей роли. Две проверки, а не одна.
Только после этих семи шагов числа в адресе превращаются в записи — и всегда из базы данных, которую выбрал третий шаг.
Что записывается
Система, которая ничего не записывает, заставляет вас верить на слово. Мы предпочитаем, чтобы вы могли проверить.
автор · действие · объект · до/после
Значимые административные действия — приостановка клиента, изменение цены тарифа, отключение купона — фиксируют, кто это сделал, над чем, а также значение до и значение после. Запись делается при каждом использовании намеренно: то, что машина делает сама, например подтверждение платежа, — не действие кого-либо и в этот список не входит.
tenant.impersonated
Служба поддержки может войти в вашу учётную запись, чтобы решить проблему. Это записывается с именем и временем, и пока это длится, вверху экрана вы видите полосу о том, что это происходит. Это не происходит тихо.
тип · содержимое · статус · ошибка
Каждое полученное платёжное событие сохраняет тип, содержимое, статус и сообщение об ошибке, если оно не удалось. Повторно пришедшее событие распознаётся и не учитывается дважды.
без тела запроса
Когда что-то ломается, мы сохраняем сообщение, файл, строку и адрес, на котором произошёл сбой. Тело запроса не сохраняется — чтобы разобраться в ошибке, не нужно хранить счёт, который вы собирались сохранить.
Данные принадлежат вам
Платформа, которая затрудняет уход, признаёт, что иначе она вас удержать не может.
один запрос, один файл
без штрафов
Что входит в выгрузку
Чего у нас пока нет
Ничто из этого не обещано и не оговорено договором. Список здесь для того, чтобы вы знали, что вы покупаете сегодня.
Экспорт готов. Удаление данных одного человека с сохранением остальных пока остаётся ручной работой — единственное автоматическое удаление касается клиента целиком.
Если вы собираетесь доверить нам данные третьих лиц, вы вправе получить конкретные ответы до подписания. Создайте учётную запись и спросите — или сначала спросите.
14 дней бесплатно, карта проверяется без списания. Отмените до 15-го дня после оформления подписки — и вы ничего не платите.