Безопасность кода – один из ключевых факторов успешного продукта. В экосистеме 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), важно проверять взаимодействие между языками. Для этого существуют два подхода:
- Использовать PHPStan‑plugins, которые позволяют описывать типы и контракты внешних скриптов, в том числе Python‑скриптов.
- Запускать 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, а также аудит существующего кода. Свяжитесь с нами, чтобы обеспечить надёжную защиту вашего продукта уже сегодня.