Задача. Выездной детейлинг автомобилей отправляет клиенту расчёт ссылкой. Клиент открывает её на телефоне, соглашается и вносит предоплату, а владелец видит все статусы в панели управления. Я попросила Bolt собрать это с нуля одним запросом. Результат выглядел готовым: панель управления, список расчётов и аккуратная страница для клиента.
Проверка. Прежде чем считать приложение готовым, я смотрю на него глазами постороннего человека, у которого есть только публичная ссылка. Мой скрипт берёт из кода страницы адрес базы данных и публичный ключ (браузер каждого посетителя и так его получает) и без входа запрашивает строки из каждой таблицы. Он только читает и считает строки, а не выводит их содержимое. Весь прогон занял около минуты.
Находка. Bolt сделал таблицу расчётов доступной для чтения всем. Посторонний мог выгрузить 8 из 8 расчётов с именем, телефоном, почтой и домашним адресом каждого клиента, а ещё личную ссылку, по которой клиент соглашается и платит. Таблица настроек тоже была открыта, и любой мог создать учётную запись в базе данных приложения, не подтверждая почту.

Исправление. Я описала исправление для Bolt одним запросом. Чтение расчётов и настроек без входа убрано. Страница клиента теперь загружает один расчёт через функцию базы данных, которая проверяет ссылку, а согласие, отказ и оплата идут через функции, которые проверяют ссылку, срок действия и статус расчёта. После этого я отключила регистрацию новых пользователей в настройках Bolt Database и сделала так, чтобы по неизвестной ссылке показывалось «Quote not found» («Расчёт не найден»).
Результат. Та же проверка, повторённая в тот же день: таблицы расчётов и настроек без входа отвечают ошибкой 401 и возвращают 0 строк. Личная ссылка клиента по-прежнему открывает его расчёт на телефоне шириной 390 px и на экране компьютера, а панель владельца работает как раньше. Перед публикацией этой страницы я ещё раз запустила проверку, результат тот же.
Границы. Внешняя проверка показывает, до чего может добраться посторонний. Исходный код построчно она не читает: это полный разбор, отдельная работа.
