Материал

Минимальный контур безопасности для команды без отдельного специалиста

Безопасность без security-инженера: как не утонуть и не игнорировать риски

Почему это проблема именно сейчас

Большинство стартапов и небольших продуктовых команд оказываются в одной и той же ловушке: безопасность откладывается до момента, когда "будет время" или "появится специалист". Время не появляется. Специалист приходит позже, чем нужно. А атаки не ждут.

При этом ситуация усугубляется ещё одним фактором: в 2024–2025 годах AI-инструменты для кодинга стали нормой, а не исключением. По данным Stack Overflow Developer Survey 2024, 76% разработчиков используют AI-инструменты в своей работе [1]. Это хорошо с точки зрения скорости, но создаёт новый класс проблем с безопасностью: код пишется быстрее, PR закрываются быстрее, зависимости добавляются быстрее — а проверяется всё это так же медленно, как и раньше, или даже медленнее.

Стандарты безопасности решают эту задачу через концепцию "minimum security baseline" — минимально необходимого набора контролей, который даёт максимальное покрытие при минимальных ресурсах. CIS Controls v8.1 (обновление вышло в июне 2024 года) делят все контроли на три группы: IG1 — базовые 56 контролей для команд любого размера, IG2 и IG3 — для более зрелых организаций [2]. Именно IG1 — это то, с чего нужно начинать без выделенного специалиста по безопасности.

Важно понимать разницу между минимальным контуром и полноценной security-программой. MSS (Minimum Security Standards) — это контроли, которые предотвращают наиболее распространённые атаки и ограничивают ущерб от инцидента. Полноценная программа включает глубокий governance, продвинутый мониторинг, security engineering и непрерывную работу по зрелости [3]. Первое — доступно любой команде. Второе — требует выделенных ресурсов.

Изображение

Что происходит с AI-кодом и почему контроль стал критичнее

Прежде чем говорить о конкретных контролях, важно понять, почему контур безопасности стал ещё более необходим именно в эпоху AI-разработки.

Исследование CodeRabbit, опубликованное в декабре 2025 года и охватившее 470 open-source pull requests на GitHub, показало: AI-сгенерированные PR содержат в среднем ~11 проблем против ~6 в PR, написанных человеком [4]. Рост в 1.7 раза по критическим и серьёзным дефектам, рост в 1.5–2 раза по уязвимостям безопасности — в первую очередь по некорректной обработке паролей и небезопасным ссылкам на объекты.

Veracode в своём 2025 GenAI Code Security Report, протестировав более 100 LLM-моделей на четырёх языках, обнаружил, что AI-сгенерированный код содержит в 2.74 раза больше уязвимостей по сравнению с кодом человека [5]. По данным за июнь 2025 года, AI-код добавлял более 10 000 новых security-находок в месяц в исследуемых репозиториях — это десятикратный рост по сравнению с декабрём 2024 года [5].

При этом 58% разработчиков доверяют AI-выводам без дополнительного тестирования [5]. Это означает, что при высокой скорости AI-кодинга без контуров безопасности в репозиторий попадает всё больше уязвимого кода — и это происходит быстрее, чем раньше.

Парадокс в том, что скорость разработки растёт, а скорость ревью — нет. PR дочитывают не до конца. Новая или транзитивная зависимость добавляется незаметно. Конфиги, миграции и internal tools читают хуже всего. Это классический сценарий, в котором минимальный контур безопасности, встроенный в процесс, работает лучше, чем любой внешний аудит раз в квартал.

Элемент 1. Управление доступом и MFA

Первый и самый очевидный элемент контура — многофакторная аутентификация на всех критических системах. Очевидный, но всё равно реализованный не везде.

Приоритет внедрения MFA: облачная инфраструктура (AWS, GCP, Azure), репозитории кода (GitHub, GitLab), системы с административным доступом, CI/CD платформы, менеджеры секретов.

Современная рекомендация — не просто MFA, а phishing-resistant MFA на основе FIDO2/WebAuthn. CISA (Агентство по кибербезопасности и защите инфраструктуры США) прямо указывает FIDO2 WebAuthn как один из двух стандартов phishing-resistant MFA [6]. В отличие от SMS-кодов или TOTP, FIDO2 использует криптографию с открытым ключом: приватный ключ не покидает устройство, а аутентификатор не может выдать валидную подпись для фишингового сайта, потому что домен не совпадает с зарегистрированным [7].

Для небольшой команды практически это выглядит так:

  1. Включить MFA для всех пользователей в GitHub/GitLab — это занимает минуты на уровне настроек организации.
  2. Для облачных провайдеров включить MFA через корневой аккаунт и все IAM-пользователи с правами выше read-only.
  3. Для максимально критичных ролей (владелец организации, admin-доступ к инфраструктуре) рассмотреть аппаратные ключи (YubiKey) или passkeys — они дают FIDO2-уровень защиты.
  4. Принцип наименьших привилегий: каждый разработчик получает минимально необходимый уровень доступа. Admin — только тем, кому это объективно нужно.

Отдельно — вопрос shared credentials. В небольших командах часто существуют общие логины к сервисам: "один аккаунт на всех". Это прямой путь к невозможности провести расследование инцидента и к тому, что ротация пароля блокирует всю команду. Менеджер паролей (1Password Teams, Bitwarden Business) с разграничением доступа к секциям решает эту проблему без создания бюрократии.

Элемент 2. Управление секретами

Утечки секретов — API-ключей, токенов, паролей — одна из самых распространённых причин инцидентов. По данным GitGuardian State of Secrets Sprawl 2024, более 12.8 миллиона секретов было закоммичено в публичные репозитории GitHub за один год [8]. Реальное число, включая приватные репозитории, на порядки выше.

Векторы утечки секретов типичны:

  1. Разработчик добавляет .env-файл или хардкодит ключ в процессе отладки и коммитит его.
  2. Секрет попадает в историю коммитов — даже после удаления файла он остаётся в git-истории.
  3. Секреты хранятся в CI/CD в виде обычных переменных окружения без шифрования.
  4. Ноутбуки разработчиков превращаются в "бесконтрольные хранилища" секретов вне зоны видимости [9].

Минимальный контур по управлению секретами строится на нескольких правилах.

Первое: ни один секрет не должен попасть в репозиторий. Для этого нужны два инструмента: .gitignore с исключением .env-файлов и pre-commit hook или CI-check, сканирующий коммиты на паттерны секретов. Инструменты: gitleaks (open-source), Truffleog, встроенное secret scanning в GitHub Advanced Security.

Второе: использовать секреты CI/CD-платформы (GitHub Actions Secrets, GitLab CI/CD Variables) вместо хранения секретов в коде или переменных окружения в plain text. Для CI/CD оптимально использовать сервисные аккаунты с временными токенами вместо долгоживущих credentials [10].

Третье: для продакшн-сред переходить на выделенные решения управления секретами. HashiCorp Vault — наиболее функциональный open-source вариант, поддерживающий динамические секреты (краткоживущие credentials, генерируемые по запросу), детальные ACL и audit logs [11]. Для команд в облачных средах: AWS Secrets Manager, Google Cloud Secret Manager, Azure Key Vault — все они интегрированы с соответствующими облачными провайдерами.

Четвёртое: разные секреты для каждой среды — никогда не использовать продакшн-секреты в разработке [8].

Если .env-файл уже был закоммичен: добавление его в .gitignore не удаляет его из истории. Нужно использовать git filter-repo для чистки истории и немедленно ротировать все скомпрометированные секреты [8].

Элемент 3. Защита репозитория и контроль кода

Репозиторий — это центральный элемент всего SDLC. Его защита — не про git-гигиену, а про AppSec-контроль: ни одно непроверенное, непротестированное или несанкционированное изменение не должно попасть в продакшн [12].

Минимальный набор branch protection rules для main/master:

  1. Требование как минимум одного approving review перед merge. Для команды из двух человек достаточно одного ревьюера; требование двух делает процесс нерабочим [12].
  2. Запрет force push и удаления ветки.
  3. Требование прохождения статус-чеков (CI) перед merge.
  4. Запрет прямого пуша в protected-ветки — только через Pull Request.

Это базовый конфиг, доступный в GitHub Free для публичных репозиториев и в GitHub Pro/Team для приватных. GitLab предоставляет аналогичную функциональность через Protected Branches и Merge Request Approvals [13].

CODEOWNERS — следующий уровень: файл, определяющий, кто должен обязательно одобрить изменения в конкретных частях кодовой базы. Полезен для критичных компонентов: конфигов инфраструктуры, файлов с обработкой аутентификации, CI/CD-пайплайнов.

Отдельная история — ревью конфигурационных файлов, миграций и CI/CD-скриптов. Это именно тот код, который читают хуже всего: он кажется "служебным", изменения в нём небольшие, но последствия могут быть критическими. Изменение в .github/workflows/deploy.yml или Dockerfile требует такого же внимания, как изменение в бизнес-логике.

Элемент 4. Безопасность зависимостей

Software supply chain атаки стали одним из наиболее значимых векторов. OWASP в своём предложении обновлённого Top 10 на 2025 год поставил Software Supply Chain Failures на третью позицию [14]. Это включает dependency confusion, typosquatting, компрометацию аккаунта мейнтейнера пакета и атаки на инфраструктуру registry.

Суть проблемы: ваше приложение использует десятки прямых зависимостей, каждая из которых тянет десятки транзитивных. Уязвимость в любой из них — это уязвимость в вашем продукте. OWASP Developer Guide рекомендует использовать SCA-инструменты для автоматического отслеживания зависимостей и их уязвимостей [15].

Инструменты для команды без security-специалиста:

Встроенные в платформу — самый простой старт. GitHub Dependabot автоматически создаёт PR с обновлением уязвимых зависимостей; GitLab предоставляет аналогичную функциональность через Dependency Scanning. Настройка занимает минуты, результат — автоматические уведомления и PR при появлении новых CVE в ваших зависимостях.

Open-source SCA-инструменты — для более глубокого контроля. Trivy, Grype, OSV-Scanner, OWASP Dependency-Check — все они бесплатны и используют те же базы уязвимостей (NVD, OSV, GitHub Advisory Database), что и коммерческие альтернативы [16]. Комбинация Syft (генерация SBOM) + Grype (сканирование на уязвимости) даёт полный open-source стек видимости supply chain без затрат.

Ключевые векторы, которые нужно контролировать:

  1. Прямые зависимости в package.json / requirements.txt / go.mod — очевидное.
  2. Транзитивные зависимости — менее очевидное, но не менее важное.
  3. Lock-файлы (package-lock.json, yarn.lock, Pipfile.lock) — их нужно коммитить в репозиторий и не игнорировать в code review.
  4. Typosquatting: пакет с именем, похожим на популярный (например, reqeusts вместо requests). Проверять точность имён новых зависимостей перед установкой.
  5. Package hallucinations: AI-ассистенты иногда предлагают несуществующие пакеты — проверять наличие пакета в официальном registry перед добавлением.

SBOM (Software Bill of Materials) — следующий уровень зрелости. Это машиночитаемый инвентарь всех компонентов приложения. Стандарты: CycloneDX (OWASP) и SPDX (Linux Foundation). Генерация SBOM при каждом билде через Syft и его хранение рядом с деплойментом даёт возможность быстро ответить на вопрос "используем ли мы уязвимую версию X?" при появлении нового advisories [17].

Элемент 5. Базовая безопасность CI/CD

CI/CD-пайплайн — это исполнительная среда с широкими правами: он деплоит код, обращается к продакшн-системам, управляет инфраструктурой. Компрометация пайплайна означает компрометацию всего, к чему у него есть доступ.

OWASP CI/CD Security Cheat Sheet описывает ключевые векторы: dependency chain abuse, компрометация сторонних интеграций, кража секретов из окружения пайплайна [18]. Для небольшой команды без security-специалиста минимальный контроль выглядит так:

  1. Секреты — только через Secrets Manager платформы (GitHub Actions Secrets, GitLab CI Variables), никогда не в plain text в yaml-файлах пайплайна.
  2. Сервисные аккаунты с минимально необходимыми правами для каждого джоба. CI-система не должна иметь admin-доступ туда, где ей нужен только деплой.
  3. Пиннинг версий actions/plugins. uses: actions/checkout@v4 безопаснее, чем uses: actions/checkout@main — последнее означает, что любое изменение в main-ветке чужого репозитория может изменить поведение вашего пайплайна.
  4. Ревью изменений в файлах CI/CD наравне с основным кодом. Файл .github/workflows/deploy.yml — это код с elevated privileges.
  5. Разделение сред: CI для разработки не должен иметь доступ к продакшн-окружению.

Элемент 6. Минимальный план реагирования на инциденты

Отсутствие плана реагирования — это не нейтральная позиция. Это означает, что в момент инцидента команда будет тратить время на выяснение "кто что делает", пока атака развивается или данные утекают. По данным отчёта Mandiant M-Trends 2024, медианное время нахождения атакующего в системе сократилось до 10 дней [19] — это значит, что у вас есть очень мало времени на реакцию.

Минимальный план реагирования для небольшой команды не должен быть объёмным документом. Это должен быть runbook — конкретная последовательность шагов, которую можно выполнить в 3 часа ночи в состоянии стресса:

  1. Как обнаружить инцидент (алерты, что мониторим).
  2. Кто является первым контактом и его резервный контакт.
  3. Как изолировать затронутую систему (конкретные команды или UI-шаги).
  4. Кого и как уведомить (внутри команды, пользователи, регулятор если применимо).
  5. Как зафиксировать доказательства до их потери.
  6. Критерии эскалации: когда подключать внешний IR-сервис.

Три типичных сценария, для которых нужны отдельные runbooks:

  • Утечка секрета/API-ключа (наиболее вероятный сценарий).
  • Компрометация аккаунта разработчика.
  • Уязвимая зависимость с активно эксплуатируемым CVE (CISA KEV).

Важно: runbook нужно тестировать. Не читать — тестировать. Хотя бы раз в квартал пройти по шагам в контролируемом окружении. Это выявляет пробелы, которые в реальном инциденте стоят часов реакции.

Элемент 7. Видимость: что логировать и на что алертить

Без видимости невозможно обнаружить инцидент. При этом для небольшой команды без security-специалиста полноценный SIEM — избыточно. Минимальный уровень видимости достигается через:

  1. Включение audit log в GitHub/GitLab организации. Это фиксирует: кто получил доступ к репозиторию, кто изменил настройки защиты ветки, кто добавил deploy key, кто поменял permissions. Бесплатно, включается в настройках.
  2. CloudTrail (AWS) / Cloud Audit Logs (GCP) / Activity Log (Azure) — аудит действий в облачной инфраструктуре. Кто и когда изменил security group, создал IAM-пользователя, обратился к секрету.
  3. Алерты на аномалии: новый admin-пользователь в организации, изменение branch protection rules, первый деплой из нового окружения, обращение к секрету из нового IP.

Для начала достаточно настроить email или Slack-уведомления на эти события через встроенные возможности платформ — без дополнительных инструментов. Это обеспечивает базовую видимость без операционной нагрузки.

Элемент 8. Управление конфигурацией и хардинг

Небезопасные конфигурации — один из наиболее распространённых векторов. CIS Controls v8.1 выделяют отдельный контроль на управление конфигурацией [2].

Для небольшой команды минимальный хардинг включает:

  1. Отключение неиспользуемых функций и открытых портов. Если сервис не используется — он не должен быть запущен и доступен.
  2. Избегание wildcard CORS (*) в продакшн API — явно перечислять разрешённые origins.
  3. Отключение debug-режима в продакшн (Django DEBUG=False, Node.js NODE_ENV=production и т.д.) — debug-режим часто раскрывает стектрейсы и internal endpoints.
  4. Проверка дефолтных учётных данных во всех компонентах (базы данных, message brokers, monitoring tools).
  5. Для Docker: не запускать контейнеры от root, минимизировать базовый образ (alpine вместо ubuntu там, где возможно).

Частые ошибки при выстраивании базового контура

Ошибка 1: Безопасность воспринимается как "роскошь" или второстепенная задача. Без поддержки руководства попытки разработчиков внедрять безопасные практики буксуют [20]. Контур безопасности — это командное решение, а не задача одного энтузиаста.

Ошибка 2: Внедрять всё сразу. Правильный подход — начинать с наиболее критичного для конкретного продукта (управление секретами и контроль зависимостей) и постепенно расширять охват [20].

Ошибка 3: Настроить и забыть. Контур требует поддержки: обновления зависимостей, ротации секретов, обновления runbook при изменении инфраструктуры. Без этого он деградирует.

Ошибка 4: Полагаться только на инструменты. Инструменты автоматизируют обнаружение, но не заменяют здравый смысл в code review. Code review конфигов, миграций и CI-файлов — обязательная практика.

Ошибка 5: Игнорировать AI-сгенерированный код. Если команда использует Copilot, Cursor или другие AI-инструменты, код из этих источников требует не менее тщательного ревью, чем код человека — а по статистике, даже более тщательного. Быстро написанный PR не означает безопасный PR.

Decision framework: с чего начать

Если вы только начинаете выстраивать контур безопасности, вот последовательность по приоритету соотношения "риск/усилие":

Первая неделя (высокий риск, низкие усилия):

  1. Включить MFA для всех членов команды на GitHub/GitLab и в облачном провайдере.
  2. Включить secret scanning в репозитории (GitHub) или добавить gitleaks в pre-commit.
  3. Проверить, что .env и аналогичные файлы есть в .gitignore.
  4. Включить Dependabot или аналог для уведомлений об уязвимых зависимостях.

Вторая неделя (высокий риск, средние усилия):

  1. Настроить branch protection rules для main: обязательный PR, хотя бы один reviewer, прохождение CI.
  2. Завести менеджер паролей для команды, убрать shared credentials.
  3. Перевести CI/CD секреты в Secrets Manager платформы, проверить, что secrets не в plain text в yaml.
  4. Написать одностраничный runbook для сценария "утёк API-ключ": что делать, в каком порядке, кто отвечает.

Первый месяц (средний риск, средние усилия):

  1. Включить CloudTrail/Cloud Audit Logs и настроить алерт на создание нового admin-пользователя.
  2. Добавить SCA-сканирование в CI-пайплайн (Trivy, Grype или OWASP Dependency-Check).
  3. Провести review всех существующих открытых портов и сервисов, закрыть неиспользуемые.
  4. Написать runbook для двух дополнительных сценариев: компрометация аккаунта разработчика и критическая уязвимость в зависимости.

Где HighVibe вписывается в этот контур

Базовый контур, описанный выше, закрывает инфраструктурный и процессный слой: доступы, секреты, зависимости, видимость. Но есть слой, который он не закрывает полностью: конкретное изменение в коде, которое прямо сейчас готовится к merge.

При росте объёма AI-генерированного кода PR-очередь растёт быстрее, чем команда успевает её ревьюить. Дифы дочитываются не до конца. Новая зависимость добавляется в рамках "небольшого PR" и остаётся незамеченной. Конфиги и CI-файлы проверяются по остаточному принципу.

HighVibe работает как дополнительный слой контроля именно на этом участке: анализирует конкретное изменение в коде, конфигах и зависимостях до merge, объясняет риск простым языком и предлагает следующий шаг — исправить, перепроверить или остановить merge. Не заменяет базовый контур и не заменяет AppSec-стек — дополняет его точечным сигналом там, где человек не всегда успевает посмотреть.

Для команды без security-специалиста это особенно актуально: нет эксперта, который видит риск "на глаз". Инструмент, который указывает на конкретную проблему в конкретном PR простым языком — это разница между "мы проверили" и "нам сказали, что проверили".

Подробнее: highvibe.dev

Итоги: что значит "достаточно безопасно" без выделенного специалиста

"Достаточно безопасно" — это не абсолютная защита. Это состояние, в котором наиболее вероятные векторы атаки закрыты, критические изменения проходят контроль, а команда знает, что делать при инциденте.

Ключевые принципы:

  • Автоматизируй всё, что можно автоматизировать. Ручные процессы без выделенного специалиста не работают.
  • Встраивай безопасность в пайплайн, а не добавляй её сверху после факта.
  • Приоритизируй по соотношению риск/усилие: MFA, секреты, зависимости — это первый круг.
  • Держи runbooks актуальными и тестируй их.
  • Особое внимание — AI-сгенерированному коду, конфигурационным файлам и изменениям в зависимостях.

Контур, описанный в этой статье, реализуем силами любой команды за 2–4 недели без найма security-специалиста. Он не делает вас неуязвимыми — но делает атаку значительно более дорогой для атакующего. Именно это и является целью базовой безопасности.

Источники

[1] Stack Overflow — "Stack Overflow Developer Survey 2024" — https://survey.stackoverflow.co/2024/

[2] Center for Internet Security — "CIS Controls v8.1" — https://www.cisecurity.org/controls/v8

[3] Compass MSP — "Minimum Security Standards: What Every CEO Needs to Know" — https://compassmsp.com/resources/minimum-security-standards-what-every-ceo-needs-to-know

[4] BusinessWire / CodeRabbit — "State of AI vs Human Code Generation Report" — https://www.businesswire.com/news/home/20251217666881/en/CodeRabbits-State-of-AI-vs-Human-Code-Generation-Report-Finds-That-AI-Written-Code-Produces-1.7x-More-Issues-Than-Human-Code

[5] SQ Magazine — "AI Coding Security Vulnerability Statistics 2026" — https://sqmagazine.co.uk/ai-coding-security-vulnerability-statistics/

[6] CISA — "Implementing Phishing-Resistant MFA" — https://www.cisa.gov/sites/default/files/publications/fact-sheet-implementing-phishing-resistant-mfa-508c.pdf

[7] SentinelOne — "What Is Phishing-Resistant MFA?" — https://www.sentinelone.com/cybersecurity-101/identity-security/phishing-resistant-mfa/

[8] AquilaX — "OWASP Secrets Management & Environment Variables Best Practices" — https://aquilax.ai/blog/owasp-secrets-management-environment-variables

[9] Doppler — "Why environment variables aren't enough for production secrets" — https://www.doppler.com/blog/environment-variables-secrets-management

[10] Medium / InstaTunnel — "Beyond .env Files: The New Best Practices for Managing Secrets in Development" — https://medium.com/@instatunnel/beyond-env-files-the-new-best-practices-for-managing-secrets-in-development-b4b05e0a3055

[11] GitGuardian — "Top Secrets Management Tools for 2026" — https://blog.gitguardian.com/top-secrets-management-tools-for-2024/

[12] Hadosec — "10 Rules of GitHub Branch Protection" — https://www.hadosec.com/blog/github-branch-protection/

[13] GitLab Docs — "Protection rules and permissions" — https://docs.gitlab.com/user/project/repository/branches/protection_rules/

[14] Reflectiz — "New OWASP No.3: Software Supply Chain Security" — https://www.reflectiz.com/blog/owasp-suppy-chain-security/

[15] OWASP Developer Guide — "Secure development and integration" — https://devguide.owasp.org/en/02-foundations/02-secure-development/

[16] AppSec Santa — "12 Free Open-Source SCA Tools 2026" — https://appsecsanta.com/sca-tools/open-source-sca-tools

[17] OWASP — "MCP04:2025 – Software Supply Chain Attacks & Dependency Tampering" — https://owasp.org/www-project-mcp-top-10/2025/MCP04-2025

[18] OWASP Cheat Sheet Series — "CI CD Security Cheat Sheet" — https://cheatsheetseries.owasp.org/cheatsheets/CI_CD_Security_Cheat_Sheet.html

[19] Wiz — "What is an Incident Response Playbook?" (со ссылкой на Mandiant M-Trends 2024) — https://www.wiz.io/academy/detection-and-response/incident-response-playbooks

[20] Radcop — "Безопасная разработка ПО в малом и среднем бизнесе: практическое руководство DevSecOps" — https://radcop.online/blog/articles/bezopasnaya-razrabotka-po-v-malom-i-srednem-biznese-msb-prakticheskoe-rukovodstvo-devsecops/

Нужен такой же контроль в ваших изменениях и релизах?

Покажем пример такого замечания на вашем сценарии и соберём пилотный контур без лишней суеты.

Запросить пилот Все статьи
Дальше по теме

Ещё материалы

Все статьи
24 июня 2026 18 мин

Политика использования ИИ в команде разработки: как не опоздать, когда всё уже идёт

Если разработчики уже пишут код с ИИ ассистентами, политика нужна сегодня — а не после первого инцидента TL;DR Более 84% разработчиков уже используют или планируют использовать ИИ инструменты 1 , и большинство делают эт…

Открыть материал
23 июня 2026 16 мин

Регистрация и онбординг пользователей: где появляются первые уязвимости

Форма регистрации выглядит просто. За ней скрывается один из наиболее атакуемых периметров приложения. TL;DR Форма регистрации и онбординг флоу — это первая поверхность атаки, которую видит злоумышленник. Большинство уя…

Открыть материал
23 июня 2026 15 мин

Бизнес-логика и мошенничество в продукте: что проверять до запуска

Ваш продукт работает правильно. Но это не значит, что он работает безопасно. TL;DR Уязвимости бизнес логики — это не сломанный код, а сломанные правила: приложение делает именно то, что написано, но не то, что задумывал…

Открыть материал