Сбои, о которых не подумали ваши тесты, - от запроса до базы данных.
SmartScan проходит от каждой точки входа - веб-действия, задания, потребителя сообщений, экрана приложения - через сервисы и обработчики до базы данных или исходящего запроса и отмечает, что может сломаться по пути: поиск, который может вернуть пустоту, две записи, которые могут выполниться наполовину, столбец, который вход может переполнить. Каждый риск приходит с цепочкой, которая к нему ведёт.
Экраны работающей установки
Что он ищет
Четыре вида риска, каждый найден на реальном пути через ваш код, а не по чьему-то шаблону.
Запись не найдена
Поиск по данным запроса может вернуть пустоту, а код использует результат без проверки: 500 вместо 404 или вводящее в заблуждение сообщение.
Частичная запись
Два отдельных коммита в одном потоке без транзакции: если второй упадёт, первый останется записанным.
Разрывы контракта
Запрос может нести больше, чем вмещает столбец, обязательный столбец не проверяется по пути, или уникальный столбец пишется без проверки уникальности.
Фронтенд и мобильные
Запрос, сбой которого никто не обрабатывает, ошибка, принятая за успех, ответ без проверки: экран падает или молчит.
Что SmartScan видит в одном запросе
Заказ создаётся за шесть шагов. Каждый шаг - реальный вызов в коде; SmartScan проходит по ним и останавливается там, где что-то может сломаться.
- Точка входа
POST /api/ordersOrdersController.Create - Запрос mediator
mediator.Send(CreateOrderCommand) - Обработчик
CreateOrderHandler.Handle - От интерфейса к реализации
ICustomerRepository.FindAsyncCustomerRepository !Не найдено: результат используется без проверки - Запись
SaveChangesAsync() ×2!Частичная запись: два коммита без транзакции - База данных
orders · order_lines
Как это работает
Единица анализа - цепочка: от входа запроса до места, где он касается данных.
- 01
Старт с каждой точки входа
Веб-действия, плановые задания и потребители сообщений; во фронтендах и приложениях - события, эффекты, маршруты и экраны.
- 02
Пройти по цепочке
От интерфейса к реализации, переопределения, запросы медиатора к обработчикам - до ORM или HTTP-вызова.
- 03
Отбросить защищённое
Проверка, поиск, бросающий исключение, валидатор с правильным лимитом - на собственном пути записи - засчитываются. Цепочка без риска не выводится.
- 04
Показать путь
Каждый риск перечисляет шаги с файлом и строкой - от точки входа до столбца.
Предупреждение, а не шлагбаум
SmartScan - не набор правил: он не снижает оценку и не валит пайплайн. Каждый риск закрывается по одному, как любая находка. Включается для проекта, по умолчанию выключен и работает только при полном сканировании - проверки MR остаются быстрыми.
На всех девяти языках коллектора
Правило и риск SmartScan - не одно и то же
Оба появляются в одной панели, но отвечают на разные вопросы и ведут себя по-разному.
| Находка правила | Риск SmartScan | |
|---|---|---|
| Что ищет | Известный шаблон, который кто-то описал | Путь через ваш собственный код |
| Оценка | Снижает с учётом серьёзности | Никогда не затрагивает |
| Пайплайн | Может остановить порогом fail-on | Никогда не останавливает |
| Когда запускается | Ревью merge request и полные сканирования | Только полные сканирования, включается для проекта |
| Что вы получаете | Файл, строка и обоснование правила | Вся цепочка по шагам, с файлом и строкой |
Вопросы о SmartScan
Это ещё один набор правил?
Как сдерживаются ложные срабатывания?
Замедляет ли он ревью merge request?
Какие языки и фреймворки?
Как это выглядит в продукте
Все скриншоты
Найдите сбои раньше пользователей
Включите SmartScan для одного проекта в ходе PoC - следующее полное сканирование покажет все рискованные цепочки.