We detected you are likely not from a Russian-speaking region. Would you like to switch to the international version of the site?

К списку статей

Автоматическое сканирование уязвимостей в Python‑пакетах: Bandit vs PHPStan

03 фев 2026 в 05:30 Усачёв Денис Евгеньевич

Безопасность кода – один из ключевых факторов успешного продукта. В экосистеме Python большое количество пакетов, которые могут содержать уязвимости, а автоматическое сканирование позволяет выявлять их на ранних этапах разработки. В статье сравниваются два популярные инструмента статического анализа: Bandit (ориентированный на Python) и PHPStan (изначально созданный для PHP, но с возможностью расширения через плагины). Мы разберём их возможности, подходы к интеграции в CI/CD и дадим практические рекомендации.

Почему важен статический анализ

Статический анализ позволяет находить потенциальные проблемы без выполнения кода. Это особенно ценно для:

  • Обнаружения уязвимостей, связанных с вводом/выводом, небезопасным использованием функций и конфиденциальными данными.
  • Поддержания единого уровня качества кода в команде.
  • Автоматизации проверок в CI/CD пайплайнах.

Bandit: обзор и возможности

Bandit – официально поддерживаемый инструмент от OpenStack, который сканирует Python‑файлы и ищет известные паттерны уязвимостей.

  • Поддержка более 200 правил (B101‑B999).
  • Гибкая конфигурация через bandit.yml.
  • Интеграция с CI (GitHub Actions, GitLab CI, Jenkins).
  • Вывод в различных форматах (JSON, CSV, SARIF).

Пример базовой установки и запуска:

pip install bandit
bandit -r ./my_project -f json -o bandit-report.json

Для более тонкой настройки можно исключить определённые файлы или правила:

bandit -r ./my_project \
       -x tests/,setup.py \
       -lll -n B101 -n B108

PHPStan: обзор и возможности в контексте Python

PHPStan – статический анализатор кода для PHP, который проверяет типы, возможные ошибки и уязвимости. Хотя он не предназначен для Python, в некоторых проектах, где Python‑модули вызываются из PHP (например, через exec или shell_exec), важно проверять взаимодействие между языками. Для этого существуют два подхода:

  1. Использовать PHPStan‑plugins, которые позволяют описывать типы и контракты внешних скриптов, в том числе Python‑скриптов.
  2. Запускать Bandit изнутри PHP‑скриптов и анализировать результат в PHPStan, используя кастомные правила.

Пример интеграции:

# composer.json
{
    "require-dev": {
        "phpstan/phpstan": "^1.10",
        "phpstan/extension-installer": "^1.0"
    },
    "extra": {
        "phpstan": {
            "includes": ["phpstan.neon"]
        }
    }
}

Создаём кастомное правило BanditResultRule.php, которое читает JSON‑отчёт Bandit и генерирует ошибки в PHPStan, если обнаружены критические уязвимости.

namespace App\PHPStan\Rules;

use PHPStan\Rules\Rule;
use PHPStan\Analyser\Scope;
use PHPStan\Rule\RuleErrorBuilder;

class BanditResultRule implements Rule
{
    public function getNodeType(): string
    {
        return \PhpParser\Node\Stmt\Class_::class;
    }

    public function processNode(\PhpParser\Node $node, Scope $scope): array
    {
        $errors = [];
        $report = json_decode(file_get_contents(DIR.'/../bandit-report.json'), true);
        foreach ($report['results'] as $result) {
            if ($result['issue_severity'] === 'HIGH') {
                $errors[] = RuleErrorBuilder::message(
                    sprintf('Bandit: %s in %s:%d', $result['test_name'], $result['filename'], $result['line_number'])
                )->build();
            }
        }
        return $errors;
    }
}

Таким образом, PHPStan становится «мостом», позволяющим включить результаты сканирования Python‑кода в единый процесс проверки качества.

Сравнительная таблица

Критерий Bandit PHPStan (c плагином)
Язык анализа Python PHP (может включать результаты Python‑сканеров)
Кол‑во готовых правил 200+ 150+ (PHP), плюс кастомные правила для Python‑отчётов
Поддержка CI/CD Да (GitHub Actions, GitLab CI, Jenkins, Azure) Да (GitHub Actions, GitLab CI, Jenkins) + интеграция с Bandit
Форматы вывода JSON, CSV, SARIF, HTML HTML, JSON (через кастомный вывод)
Лёгкость настройки Простая конфигурация .bandit.yml Требует написания плагина/правила
Поддержка типизации Может использовать mypy‑type hints Полная поддержка PHP типизации, типы Python‑скриптов только через аннотации в правилах

Практические рекомендации

  • Для чисто Python‑проектов используйте Bandit как основной инструмент статического анализа.
  • Если ваш проект содержит PHP‑слой, который взаимодействует с Python‑скриптами, добавьте кастомное правило в PHPStan, которое будет импортировать результаты Bandit.
  • Настройте CI‑pipeline так, чтобы Bandit запускался первым, а затем PHPStan проверял как PHP‑код, так и импортированные результаты.
  • Регулярно обновляйте правила Bandit (команда pip install --upgrade bandit) и PHPStan (composer update phpstan/phpstan).
  • Используйте формат SARIF для интеграции с системами управления уязвимостями (GitHub Security, Azure DevOps).

Заключение

Bandit остаётся лучшим выбором для непосредственного сканирования Python‑кода, предоставляя широкий набор правил и простую интеграцию. PHPStan, будучи инструментом для PHP, может стать полезным дополнением в гибридных проектах, позволяя собрать результаты сканирования Python‑пакетов в единый отчёт о качестве кода.

Комбинация обоих инструментов обеспечивает всестороннюю проверку, повышает безопасность продукта и упрощает процесс аудита.

Услуги RybinskLab

RybinskLab предлагает полный спектр услуг по внедрению автоматических проверок безопасности: настройка Bandit, разработка кастомных правил для PHPStan, интеграция в CI/CD, а также аудит существующего кода. Свяжитесь с нами, чтобы обеспечить надёжную защиту вашего продукта уже сегодня.

* Материал подготовлен с использованием ИИ-ассистента, проверен и отредактирован экспертом RybinskLab.

Поделиться материалом:

Нужна сложная разработка?

Усачёв Денис Евгеньевич — проектирование архитектуры, бэкенд на PHP/Python, интеграции API и базы данных.

Обсудить проект