Ward, створений El Jakani Yassine, — це командний сканер безпеки на Go, орієнтований на структуру Laravel. Замість загального пошуку патернів у кодовій базі, він спершу аналізує структуру проєкту — маршрути, моделі, контролери, middleware, шаблони Blade, файли конфігурації, змінні оточення та залежності — і лише потім виконує цілеспрямовані перевірки в цьому контексті.
Встановлення
Ward поширюється як Go-бінарник, тож переконайтеся, що Go встановлено, після чого виконайте:
go install github.com/eljakani/ward@latest
# Make sure $GOPATH/bin is in your PATH
export PATH="$PATH:$(go env GOPATH)/bin"
Після встановлення запустіть ward init — це створить ~/.ward/ з файлом конфігурації за замовчуванням, понад 42 вбудованими правилами, впорядкованими за категоріями, а також директоріями для звітів та історії сканувань.
Сканування проєкту
Вкажіть Ward локальну папку або віддалений Git-репозиторій:
# Local project
ward scan /path/to/laravel-project
# Remote repository (shallow cloned)
ward scan https://github.com/user/laravel-project.git
У терміналі Ward відкриває TUI. Під час сканування видно прогрес конвеєра та живі лічильники серйозності. По завершенні відображається таблиця результатів з можливістю сортування, бейджами серйозності, групуванням за категоріями та панеллю деталей з описами, фрагментами коду й рекомендаціями для виправлення.
Що перевіряє
Ward містить чотири незалежні двигуни сканування:
- env-scanner — виконує 8 перевірок файлу
.env, зокрема: увімкнений debug у production, відсутній або слабкийAPP_KEY, та витік секретів у.env.example. - config-scanner — 13 перевірок у файлах
config/*.php, що виявляють жорстко зашиті креденшіали, небезпечні сесійні прапори, CORS із wildcard-джерелами та відсутні опції безпеки. - dependency-scanner — звертається в реальному часі до бази порад OSV.dev і порівнює їх з вашим
composer.lock, щоб знайти вразливі пакети Packagist. Оскільки запити йдуть до живих даних, результати відображають актуальні поради, а не стан на момент останнього релізу інструмента. - rules-scanner — застосовує 42 правила в 7 категоріях: secrets (жорстко зашиті паролі, API-ключі, AWS-креденшіали), injection (SQL, командні інʼєкції,
eval), XSS (неекрановане виведення в Blade, інʼєкція JavaScript), артефакти дебагу (dd(),dump(),phpinfo()), слабка криптографія (md5,sha1, небезпечні RNG), проблеми конфігурації (CORS, CSRF, mass assignment) та прогалини в аутентифікації (відсутній middleware, відсутнє обмеження швидкості).
Формати виводу
Налаштуйте формати виводу в ~/.ward/config.yaml:
output:
formats: [json, sarif, html, markdown]
dir: ./reports
- JSON — машинозчитувані результати
- SARIF — сумісний з GitHub Code Scanning та інтеграціями IDE
- HTML — автономний звіт у темній темі
- Markdown — підходить для коментарів у PR
Інтеграція в CI/CD
Ward повертає ненульовий код завершення, якщо знайдені знахідки заданого рівня серйозності, тому його просто використовувати для блокування деплоїв:
ward scan . --output json --fail-on high
Приклад для GitHub Actions у документації проєкту:
Робота з baseline
Якщо команда хоче зафіксувати поточні знайдені проблеми, не вимикаючи перевірки для майбутніх, Ward підтримує workflow з baseline:
# Capture current state
ward scan . --output json --update-baseline .ward-baseline.json
# On subsequent runs, suppress known findings and fail only on new ones
ward scan . --output json --baseline .ward-baseline.json --fail-on high
Коміт .ward-baseline.json у репозиторій дає змогу відстежувати, які знайдені проблеми визнані, і виявляти регресії в CI.
Користувацькі правила
Киньте .yaml-файли в ~/.ward/rules/, щоб додати власні перевірки. Правила підтримують regex- або підрядкові пошуки, перевірку існування файлу та негативні патерни, що спрацьовують, коли чогось бракує — наприклад, маршрути без @csrf. Можна таргетити PHP-файли, шаблони Blade, файли конфігурації, .env, маршрути, міграції або JavaScript.
rules:
- id: TEAM-001
title: "Hardcoded internal service URL"
severity: medium
patterns:
- type: regex
target: php-files
pattern: 'https?://internal-service\.\w+'
Вбудовані правила можна вимкнути або змінити їхню серйозність у config.yaml без редагування самих файлів правил.
Історія сканувань
Ward зберігає кожен результат у ~/.ward/store/ і при наступних запусках показує diff від попереднього сканування — наприклад, «2 new, 3 resolved (12→11)» — щоб ви бачили, як змінюється безпековий стан проєкту з часом.
Перегляньте вихідний код і почніть роботу на Eljakani/ward на GitHub.