Материал

Как настроить GitHub branch protection для AI-generated PR

Merge gate в эпоху вайб-кодинга: как не пустить уязвимый AI-код в прод

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

Исследование Veracode протестировало более 100 LLM-моделей на Java, Python, C# и JavaScript. Результат: 45% образцов AI-сгенерированного кода содержали уязвимости из OWASP Top 10, а у Java этот показатель достиг 72% [1]. Независимое исследование Apiiro по Fortune 50 компаниям зафиксировало в AI-генерируемом коде 2,74× больше уязвимостей по сравнению с кодом, написанным разработчиком вручную, и рост количества путей к privilege escalation на 322% [2].

Важная деталь из отчёта Veracode: увеличение размера модели само по себе не решает проблему безопасности. Процент безопасного AI-кода практически не вырос вместе с ростом параметров моделей [1]. Это означает, что команды не могут просто подождать, пока AI "починят" — нужно строить процессы контроля сейчас.

К маю 2025 года, по данным Apiiro, AI-генерируемый код добавлял свыше 10 000 новых security-находок в месяц по отслеживаемым репозиториям — рост в 10 раз относительно конца 2024 [2]. А Checkmarx в своём глобальном опросе 2025 зафиксировал, что почти 70% респондентов оценивают долю AI-кода в своей кодовой базе на уровне более 40% [3].

Скорость генерации опережает скорость ревью. Дифф читают не до конца. Новые зависимости приезжают незаметно. Branch protection — это тот самый "steel shutter" (стальная заслонка), которая стоит между AI-сгенерированным кодом и вашим продом [4].

Архитектура защиты: Branch Protection Rules vs Rulesets

GitHub предлагает два механизма — классические Branch Protection Rules и более новые Rulesets. Понимание разницы критически важно для правильной конфигурации.

Branch Protection Rules: логика приоритетов

Классические правила работают по принципу "одно правило на ветку" — одновременно применяется только одно правило, и если несколько правил таргетируют одну ветку, побеждает то, которое содержит точное имя ветки. При совпадении нескольких точных имён побеждает более раннее по дате создания [5].

По умолчанию ограничения классических Branch Protection Rules не применяются к пользователям с правами администратора репозитория. Это означает, что без явного включения опции "Include administrators" администраторы могут пропустить AI-генерируемый код мимо всех проверок [5].

Rulesets: современный подход

Rulesets — это эволюция защиты веток, предназначенная для масштабирования на уровне организации [6]. Ключевые отличия:

  • Несколько Rulesets могут применяться к одной ветке одновременно, при этом работает принцип наиболее строгого правила: если один ruleset требует 2 ревью, а другой — 3, то применяется требование из 3 ревью [6]
  • Rulesets видны всем пользователям с read-доступом к репозиторию — разработчик сразу понимает, почему PR заблокирован, без права администратора [6]
  • Enforcement status позволяет переключаться между Active, Evaluate (мониторинг без блокировки) и Disabled — удобно для постепенного внедрения [6]
  • Rulesets поддерживают метаданные коммитов: можно требовать определённый формат commit message или email автора

Для команд, которые активно используют AI-инструменты, Rulesets предпочтительнее: они позволяют сначала запустить режим Evaluate (видеть, что было бы заблокировано), не останавливая команду, а затем переключиться на Active после тонкой настройки.

Required Status Checks: сердце merge gate

Required status checks — это механизм, который связывает результаты CI/CD-проверок с разрешением на merge. Если проверка не прошла — PR заблокирован [7].

Базовая конфигурация

# Пример Ruleset через GitHub API
name: "AI Code Protection"
target: "branch"
enforcement: "active"
conditions:
  ref_name:
    include: ["refs/heads/main", "refs/heads/master"]
rules:
  - type: "required_status_checks"
    parameters:
      strict_required_status_checks_policy: true
      required_status_checks:
        - "security/codeql"
        - "security/secret-scan"
        - "ci/build"
        - "sca/dependency-review"
  - type: "required_pull_request_reviews"
    parameters:
      required_approving_review_count: 2
      dismiss_stale_reviews: true
      require_code_owner_reviews: true

Параметр strict_required_status_checks_policy: true означает, что ветка должна быть актуальна относительно базовой ветки перед merge — это исключает ситуацию, когда AI-генерируемый код проверяется изолированно, без учёта свежих изменений в main [5].

Критический момент: уникальность имён job

Если одно и то же имя job используется в нескольких workflow, статус-чек становится неоднозначным и может блокировать PR из-за неверного матчинга [5]. Для AI-related проверок используйте префиксы: security/, ai-review/, sca/.

Dismiss stale reviews: защита от re-approval обхода

При включённой опции dismiss_stale_reviews одобренное ревью автоматически сбрасывается при новом коммите в PR. Это критически важно для AI-генерируемого кода: разработчик получил approval, потом попросил Copilot "улучшить" функцию — без этой опции merge пройдёт без повторной проверки изменённого кода [5].

Code Scanning Merge Protection: блокировка по результатам CodeQL и AI-детекций

GitHub предоставляет встроенный механизм блокировки PR на основе результатов code scanning — без необходимости самостоятельно писать CI-логику для этого [8].

Начиная с марта 2026 года GitHub Code Security расширил покрытие: к CodeQL (семантический анализ) добавились AI-powered security detections для Shell/Bash, Dockerfile, Terraform (HCL) и PHP. В ходе внутреннего тестирования система обработала более 170 000 находок за 30 дней, получив более 80% позитивных отзывов от разработчиков [9].

Настройка Code Scanning Merge Protection через Rulesets

Войдите в Settings → Rules → Rulesets → New branch ruleset. Задайте целевые ветки (main, master, release/*). В разделе Rules найдите "Require code scanning results" и добавьте инструменты с пороговыми значениями серьёзности. Сохраните с enforcement: active [8].

Для API-конфигурации используется тип правила code_scanning с параметрами tool (название инструмента, например CodeQL), security_alerts_threshold (critical, high, medium, low, none) и alerts_threshold (для non-security находок) [8].

Логика пороговых значений: не блокируй всё сразу

Специалисты AquilaX и TURBOGEEK рекомендуют следующую стартовую политику для команд с AI-генерируемым кодом [10], [11]:

  • CRITICAL/HIGH — блокировать merge. Это эксплуатируемые уязвимости, которые не должны попасть в основную ветку без исправления или явного exception
  • MEDIUM — репортировать, не блокировать. Автоматически создавать тикет
  • LOW/INFO — информационно, убирать из вывода CI, отслеживать на дашборде

Важная рекомендация: начинайте с Evaluate/reporting mode. При включении блокировки на существующей кодовой базе с первого дня вы, скорее всего, обнаружите сотни находок и полностью остановите работу команды. Две недели в reporting-режиме, триаж, исправление реальных проблем, подавление ложных срабатываний — и только потом включение блокировки [11].

CODEOWNERS: mandatory human review для чувствительных зон

CODEOWNERS — это конфигурационный файл, который определяет, кто должен ревьюить изменения в конкретных файлах или директориях [12]. В контексте AI-генерируемого кода это механизм назначения "ответственных за безопасность" на критические части кодовой базы.

Структура CODEOWNERS для защиты от AI-кода

# Глобальный владелец — для всего, что не покрыто ниже
*                   @security-team

# Аутентификация и авторизация — только senior разработчики + AppSec
/src/auth/          @senior-devs @appsec-team
/src/crypto/        @senior-devs @appsec-team

# Платёжная система — строгий контроль
/src/payments/      @payments-team @security-team

# Инфраструктурные конфигурации
/.github/workflows/ @devops-team @security-team
/terraform/         @infra-team @security-team
/docker/            @infra-team

# Миграции базы данных
/db/migrations/     @db-team @backend-lead

# Зависимости
package.json        @security-team
package-lock.json   @security-team
requirements.txt    @security-team
go.sum              @security-team

Исследование Checkmarx 2025 специально выделяет аутентификационные модули, финансовые системы и платёжную обработку как зоны, где использование AI-кода должно быть максимально ограничено или запрещено [3]. CODEOWNERS обеспечивает это ограничение на уровне процесса.

Важный нюанс для GitHub: CODEOWNERS-ревью не засчитываются как required human approval сами по себе — необходимо включить "Require review from Code Owners" в branch protection settings в связке с опцией required_approving_review_count [12].

GitHub Actions: CI/CD-пайплайн как security gate

SAST через GitHub Actions: минимальная конфигурация

name: Security Gate

on:
  pull_request:
    branches: [main, master, release/*]

permissions:
  pull-requests: write
  contents: read
  security-events: write

jobs:
  codeql-analysis:
    name: security/codeql
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Initialize CodeQL
        uses: github/codeql-action/init@v3
        with:
          languages: javascript, python
          queries: security-and-quality
      - name: Autobuild
        uses: github/codeql-action/autobuild@v3
      - name: Perform CodeQL Analysis
        uses: github/codeql-action/analyze@v3
        with:
          upload: true

  dependency-review:
    name: sca/dependency-review
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Dependency Review
        uses: actions/dependency-review-action@v4
        with:
          fail-on-severity: high
          deny-licenses: GPL-3.0, AGPL-3.0

  secret-scan:
    name: security/secret-scan
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: Detect Secrets
        uses: trufflesecurity/trufflehog@main
        with:
          path: ./
          base: ${{ github.event.repository.default_branch }}
          head: HEAD
          extra_args: --only-verified

Ключевой момент: permissions: pull-requests: write обязательно [13]. Без этого сканер найдёт уязвимости, но не сможет опубликовать инлайн-комментарии в PR — основной механизм донесения находок до разработчика.

Dependency Review Action: SCA специально для PR

actions/dependency-review-action анализирует изменения в файлах зависимостей (package-lock.json, requirements.txt, go.sum) и блокирует merge при добавлении пакетов с известными уязвимостями высокой серьёзности [5]. Для AI-генерируемого кода это особенно актуально: LLM-модели могут предлагать несуществующие или устаревшие пакеты, а также пакеты с известными CVE.

Secret Detection: AI-код и проблема "fallback keys"

AI-инструменты склонны генерировать примеры кода с placeholder-токенами, которые разработчик оставляет в коде. Кроме того, LLM могут воспроизводить паттерны hardcoded credentials из обучающих данных [3]. TruffleHog с флагом --only-verified снижает количество ложных срабатываний, проверяя, действительно ли найденный секрет работает.

AI Code Review инструменты: комментарии без права голоса

Важно чётко разделить две категории инструментов:

  • Инструменты, дающие AI-комментарии в PR (GitHub Copilot Code Review, CodeRabbit, Sentry Code Review, Claude Code Review)
  • Инструменты, создающие status checks, которые можно сделать required

По состоянию на 2025-2026 год GitHub Copilot code review не имеет права заменить required human approval в репозиториях с branch protection [4]. "The thing that matters is not the AI comment. It is the merge box itself" — AI-отзывы расширили охват и скорость обратной связи, но merge gate по-прежнему управляется людьми через branch protection, rulesets, required reviews, CODEOWNERS [4].

Некоторые инструменты (Sentry Code Review, CodeAnt AI) создают GitHub status checks, которые технически можно добавить как required. Sentry Code Review, например, создаёт check с результатом Success (нет ошибок), Neutral (найдены проблемы, блокировка не происходит) или Error (технический сбой) [14]. При этом сам Sentry предупреждает: добавление их AI-чека как required status check не рекомендуется из-за возможных сбоев сервиса и будущих опций пользовательской конфигурации [14].

Практический вывод: AI code review инструменты — это дополнительный слой сигнализации, а не замена required human review. Включайте их в обязательные проверки с осторожностью, оставляя человеческое ревью как окончательный gate.

Rulesets на уровне организации: масштабирование политики

Для организаций с несколькими репозиториями, где AI-инструменты используются командами, отдельная настройка защиты для каждого репо нерациональна. GitHub Enterprise поддерживает Organization-level rulesets [5].

Настройка через GitHub Organization Settings → Rules → New ruleset. В "Target repositories" можно указать паттерны (например, all repositories или repositories matching *-service). В разделе Conditions → Repository name можно задать Include all или конкретные паттерны.

Организационные rulesets агрегируются с репозиторными: если организационный ruleset требует 1 ревью, а репозиторный — 2, применяется требование из 2 ревью по принципу наиболее строгого правила [6].

Security configurations (доступны в GitHub Enterprise Cloud) позволяют задать организационные security defaults, которые применяются автоматически к новым репозиториям [15].

Обработка bot и AI-агентов: bypass без потери контроля

Отдельная проблема возникает, когда бот-аккаунты или AI-агенты (например, Dependabot, release-боты) создают PR и им тоже требуется проходить все проверки.

GitHub не поддерживает нативное разграничение "для ботов — меньше ревью, для людей — больше" [16]. Доступные варианты:

  • "Allow specified actors to bypass required pull requests" — даёт аккаунту право пушить напрямую в защищённую ветку без открытия PR. Это не означает, что PR от этого аккаунта автоматически merge-ируются без ревью — правило required reviews по-прежнему применяется к открытым PR [16]
  • Для GitHub Actions workflows: использование PAT или GitHub App token вместо стандартного GITHUB_TOKEN — стандартный токен обычно не проходит bypass protections [16]
  • Для Dependabot: рекомендуется оставить auto-merge включённым только после прохождения всех status checks, что создаёт автоматизированный, но контролируемый процесс

При использовании pull_request_target event в GitHub Actions: с декабря 2025 года GitHub изменил логику — workflow теперь всегда использует default branch как источник, а не ветку PR, что снижает риски выполнения устаревших уязвимых workflow [17].

Работа с CODEOWNERS и чувствительными путями

Для AI-генерируемого кода особенно важно настроить CODEOWNERS на зоны высокого риска. Checkmarx выделяет "prohibited tasks" — код, который не должен генерироваться AI без специального разрешения: authentication systems, authorization frameworks, cryptographic implementations, payment processing, secrets management [3].

Через CODEOWNERS эти зоны можно закрыть:

# Запрещённые для AI-кода зоны требуют ревью AppSec-команды
/src/auth/          @appsec @security-champion
/src/crypto/        @appsec @security-champion
/src/payments/      @appsec @payments-security

В связке с require_code_owner_reviews: true это означает, что любой PR, затрагивающий эти пути, будет заблокирован до получения явного одобрения от назначенного владельца — независимо от того, кто открыл PR (человек, AI-агент, Copilot).

Типичные ошибки и как их избежать

Включение всех блокировок с первого дня на существующей кодовой базе. Решение: начинайте с Evaluate mode (Rulesets) или reporting mode (SAST), проводите триаж 2 недели, фиксируйте реальные проблемы, подавляйте ложные срабатывания — только потом переводите в enforcement [11].

Дублирующиеся имена job в workflow. Если два workflow используют job с именем test, статус-чек становится неоднозначным и может случайно блокировать PR [5]. Используйте namespace-префиксы: security/codeql, sca/deps, ci/build.

Игнорирование параметра dismiss_stale_reviews. Без него разработчик получает approval, переспрашивает у AI "сделай лучше", получает новый коммит в PR — и merge проходит без повторного ревью изменённого кода [5].

Bypass без аудита. Опция bypass создаёт "запасной выход", который разработчики быстро привыкают использовать. GitHub Community обсуждает эту проблему: bypass UI "trains users to bypass, and it's not easy to see what exactly you are bypassing" [15]. Решение: логируйте все bypass-события, настройте алёрты на использование bypass в production-ветках.

Отсутствие покрытия IaC и конфигурационных файлов. AI-инструменты активно генерируют Terraform, Dockerfile, GitHub Actions workflow — эти файлы часто остаются вне CODEOWNERS и SAST. GitHub AI-powered detections (public preview 2026) расширяют покрытие именно на эти форматы [9].

Не блокировать PR с ошибками сканирования. Если security-job упал по техническим причинам (timeout, ошибка сервиса), GitHub помечает статус-чек как Error. При неправильной конфигурации такой PR может merge-ироваться. Проверьте, что ваш required status check действительно ожидает Success, а не просто "любой завершённый статус".

Практический чек-лист: настройка за один спринт

Шаг 1. Переходите на Rulesets вместо классических Branch Protection Rules для всех новых конфигураций. Существующие правила продолжают работать, но Rulesets масштабируются лучше и поддерживают Evaluate mode.

Шаг 2. Настройте Code Scanning через GitHub Code Security (CodeQL + AI-powered detections). Включите режим Alert mode (без блокировки) на 2 недели для baseline.

Шаг 3. Добавьте GitHub Actions workflow с dependency-review-action и TruffleHog. Сделайте их required status checks, но с порогом HIGH для блокировки — не MEDIUM/LOW.

Шаг 4. Аудитируйте CODEOWNERS: убедитесь, что /src/auth/, /src/crypto/, /.github/workflows/, файлы зависимостей (package-lock.json, requirements.txt, go.sum) покрыты владельцами из AppSec или Security Champion-программы.

Шаг 5. Включите dismiss_stale_reviews: true и require_code_owner_reviews: true в Ruleset.

Шаг 6. После 2-недельного baseline переведите Code Scanning Merge Protection в Active с порогом CRITICAL/HIGH.

Шаг 7. Настройте аудит bypass-событий. В GitHub Enterprise: organization audit log фиксирует bypass. Настройте webhook или алёрт на ruleset.bypassed event.

Шаг 8. Пересматривайте конфигурацию раз в квартал: AI-инструменты и паттерны уязвимостей меняются, и статическая конфигурация быстро устаревает [2].

Почему "работает в staging" не значит "безопасно для merge"

AI-инструменты генерируют функционально корректный код. Проблема в том, что "работает" и "безопасно" — разные критерии. SQL-инъекция работает. XSS-уязвимость работает. Hardcoded token работает до компрометации.

Исследования показывают: AI-модели воспроизводят небезопасные паттерны из обучающих данных, потому что интернет полон небезопасного кода. LLM — это движки предсказания, а не эксперты по безопасности [2]. Privilege escalation paths создаются не потому, что AI "хочет" нанести вред, а потому что он предсказывает следующий токен на основе статистики.

Рабочий PR не обязательно безопасен. Большой диф читают не до конца. Новая транзитивная зависимость приезжает незаметно вместе с нужным пакетом. Конфигурационные файлы и миграции БД проверяются хуже всего — именно на них AI-инструменты используются активнее всего для ускорения.

Именно здесь имеет смысл дополнительный слой контроля — инструмент, который смотрит не на весь репозиторий, а на конкретный диф: что именно изменилось, какие зависимости появились, что в конфигах, что в служебных файлах. HighVibe устроен по этой логике: не очередной длинный security-отчёт перед релизом, а короткий и понятный сигнал команде — можно ли безопасно принять именно это изменение сейчас. Рядом с CodeQL, Dependabot и CODEOWNERS, а не вместо них.

Тренды и что изменится в ближайшее время

GitHub продолжает расширять AI-powered security detections в направлении большего покрытия языков и фреймворков. В marте 2026 года в public preview вышла поддержка Shell/Bash, Dockerfile, Terraform и PHP [9]. Ожидается расширение на Ruby, Swift, Kotlin и другие экосистемы.

OpenSSF в 2025 году опубликовал Security-Focused Guide for AI Code Assistant Instructions [18] — официальные рекомендации по встраиванию "security conscience" непосредственно в AI-инструменты разработчика (через .cursor/rules, .copilotinstructions, CLAUDE.md). Это upstream-контроль: попытка сделать AI-генерируемый код безопаснее на входе, не только на merge gate. Но downstream-gate (branch protection) остаётся необходимым: upstream instructions снижают риск, но не устраняют его.

Required review by specific teams теперь доступен в Rulesets (ноябрь 2025) [15] — это закрывает давний пробел, когда было сложно требовать ревью от конкретной команды, а не просто "кого-либо с write access".

Merge queues в Rulesets (public beta 2025) позволяют выстраивать очередь merge и запускать проверки на "предполагаемом" merge commit, а не только на ветке PR — это снижает количество ситуаций, когда проверки проходят, но после merge в main что-то ломается.

Заключение

Branch protection в эпоху AI-кодинга — это не ограничение скорости разработки, а её условие. Команды, которые строят надёжный merge gate сейчас, получают возможность безопасно увеличивать долю AI-кода в будущем, не наращивая риск одновременно.

Конкретный следующий шаг: войдите в Settings → Rules → Rulesets вашего репозитория, создайте ruleset в Evaluate mode с required_status_checks на CodeQL и dependency-review. Посмотрите, что было бы заблокировано за последние 30 дней. Это даст более точное понимание реального риска, чем любой абстрактный security-аудит.

Источники

[1] Veracode — "2025 GenAI Code Security Report" — https://www.veracode.com/blog/genai-code-security-report/

[2] SoftwareSeni — "AI-Generated Code Security Risks - Why Vulnerabilities Increase 2.74x" — https://www.softwareseni.com/ai-generated-code-security-risks-why-vulnerabilities-increase-2-74x-and-how-to-prevent-them/

[3] Checkmarx — "2025 CISO Guide to Securing AI-Generated Code" — https://checkmarx.com/blog/ai-is-writing-your-code-whos-keeping-it-secure/

[4] Medium / KAIRI — "GitHub's 2025 Copilot Review Can't Satisfy the Merge Gate" — https://medium.com/kairi-ai/githubs-2025-copilot-review-can-t-satisfy-the-merge-gate-f1de0e535788

[5] GitHub Docs — "About protected branches" — https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/about-protected-branches

[6] GitHub Docs — "About rulesets" — https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-rulesets/about-rulesets

[7] GitHub Docs — "Available rules for rulesets" — https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-rulesets/available-rules-for-rulesets

[8] GitHub Docs — "Set code scanning merge protection" — https://docs.github.com/en/code-security/code-scanning/managing-your-code-scanning-configuration/set-code-scanning-merge-protection

[9] GitHub Blog — "GitHub expands application security coverage with AI-powered detections" — https://github.blog/security/application-security/github-expands-application-security-coverage-with-ai-powered-detections/

[10] AquilaX — "How to Add SAST to Your CI/CD Pipeline" — https://aquilax.ai/blog/sast-cicd-pipeline-setup

[11] TURBOGEEK — "SAST in GitHub Actions: How to Catch Dangerous Code Earlier" — https://www.turbogeek.co.uk/sast-github-actions-devsecops/

[12] Harness — "Understanding CODEOWNERS to enhance code ownership in Git" — https://www.harness.io/blog/mastering-codeowners

[13] CodeAnt AI — "How to Integrate SAST into GitHub Actions, GitLab CI, and Azure DevOps" — https://www.codeant.ai/blogs/how-to-integrate-sast-into-ci-cd

[14] Sentry Docs — "Code Review" — https://docs.sentry.io/product/ai-in-sentry/seer/code-review/

[15] GitHub Community — "Locking Down GitHub Enterprise: A Security-First Approach" — https://github.com/orgs/community/discussions/182182

[16] GitHub Community — "Exempt an approval requirement for automated account" — https://github.com/orgs/community/discussions/167357

[17] GitHub Changelog — "Actions pull_request_target and environment branch protections changes" — https://github.blog/changelog/2025-11-07-actions-pull_request_target-and-environment-branch-protections-changes/

[18] OpenSSF Best Practices Working Group — "Security-Focused Guide for AI Code Assistant Instructions" — https://best.openssf.org/Security-Focused-Guide-for-AI-Code-Assistant-Instructions.html

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

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

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

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

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

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

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

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

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

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

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

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

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

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