Дефолты могут вас потопить
TL;DR: Относитесь к неизвестным ответам как к несанкционированным, а не как к действительным.
Проблемы
- Риски безопасности
- Игнорирование неизвестных случаев
- Ошибка Неправильная интерпретация
- Возврат к допустимым состояниям по умолчанию
- Несоответствие разрешений
- Невозможность регистрации событий
- Потенциал эксплуатации
Решения
- Проверьте все ответы по закрытому набору известных кодов.
- По умолчанию (и неизвестно) для неавторизованных или Удалить значения по умолчанию .
- Регистрируйте все несоответствующие или неожиданные случаи для анализа.
- Тестирование с использованием граничных сценариев.
- Регулярно синхронизируйте пулы ответов с процессорами, чтобы избежать устаревания кодов.
- Сосредоточьтесь на безопасности, сделав этот процесс более левым.
- Проектируйте системы, устойчивые к изменениям, чтобы справляться с меняющимися сценариями.
Контекст
Сегодня — день компьютерной безопасности , и каждый программист должен осознать свою ответственность.
Представьте себе приложение, обрабатывающее продажи, которое использует пулы ответов от процессоров кредитных карт для обработки транзакций.
Каждый процессор кредитных карт предоставляет предопределенные коды ответов для различных ситуаций, таких как недостаточный баланс или истекший срок действия карты.
Проблема возникает, когда процессор добавляет новый код ответа для отклоненных транзакций, но не уведомляет об этом платформу.
Приложение не распознает новый код, по умолчанию обрабатывает его как «не найденный» и разрешает покупку.
Пользователи замечают этот недостаток и используют его для совершения несанкционированных покупок.
Доходы платформы резко падают, что приводит к банкротству.
Образец кода
Неправильный
String response = paymentProcessor.authorize(cardDetails); switch (response) { case "DECLINED_INSUFFICIENT_FUNDS": // Handle insufficient funds break; case "DECLINED_EXPIRED_CARD": // Handle expired card break; default: // Authorize purchase break; }
Верно
String response = paymentProcessor.authorize(cardDetails); switch (response) { case "APPROVED": // Authorize purchase break; case "DECLINED_INSUFFICIENT_FUNDS": // Handle insufficient funds break; case "DECLINED_EXPIRED_CARD": // Handle expired card break; case "DECLINED_NEW_REASON": // Handle new declined reason break; default: // Reject purchase (default case for unknown responses) break; }
Обнаружение
- [x] Руководство
Вы можете обнаружить этот запах, просмотрев логику обработки ошибок.
Проверьте, регистрирует ли система и отклоняет ли она нераспознанные случаи.
Автоматизированные тесты могут помочь определить, приводят ли новые или неожиданные входные данные к допустимым действиям.
Инструменты статического анализа могут помочь, отметив потенциально неполную обработку ошибок.
Теги
- Безопасность
Уровень
- [x] Средний
Почему важна биекция
Крайне важно поддерживать однозначное соответствие между внутренним представлением ответов платежного процессора в вашем приложении и фактическими кодами, возвращаемыми процессором.
Когда вы нарушаете биекцию , вы создаете несоответствие.
Приложение неправильно интерпретирует неизвестные коды, что приводит к неожиданному поведению, уязвимостям безопасности и потенциально катастрофическим последствиям для бизнеса.
Генерация ИИ
Инструменты ИИ могут создать такой запах, если вы не укажете, как обрабатывать неизвестные случаи.
Например, общая обработка ошибок может по умолчанию выдавать безобидные результаты, такие как «не найдено» или «успешно».
Обнаружение ИИ
Генераторы ИИ могут устранить этот запах, если вы дадите им указание обрабатывать неизвестные случаи как несанкционированные и уделять особое внимание регистрации и тестированию неожиданных сценариев.
Попробуйте!
Помните: помощники на основе искусственного интеллекта совершают много ошибок
Без надлежащих инструкций | С конкретными инструкциями |
---|---|
Заключение
Всегда будьте осторожны в неизвестных случаях.
Значения по умолчанию, такие как «не найдено», могут привести к серьезным проблемам безопасности и финансовым потерям.
Сделайте регистрацию и отклонение неизвестных ответов частью своей практики разработки.
Принимайте решения в пользу безопасности при программировании.
Отношения
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxii
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-viii-8mn3352
Отказ от ответственности
Код Запахи - это мое мнение .
Кредиты
Фото Натаны Ребусас на Unsplash
https://www.youtube.com/watch?v=J2QOejhA6ek
Предположения — мать всех неудач.
Саид Уиссаль
Программная инженерия Великие цитаты
Эта статья является частью серии CodeSmell.