Search by

ikwook / sentinel-shield

freddylihamba

Detection d'attaques web, alertes (dashboard + e-mail) et blocage d'IP pour CodeIgniter 4 et Laravel.

v0.1.0 2026-11-04 12:16 UTC

This package is not auto-updated.

Last update: 2026-11-05 10:53:00 UTC


README

Détection d'attaques web, alertes (dashboard + e-mail) et blocage d'IP pour CodeIgniter 4 et Laravel. Un seul cœur PHP, un seul dashboard, deux adaptateurs.

  • Détecte : injection SQL, XSS, injection de commande/code/en-têtes, SSRF, accès aux fichiers système, recherche de fichiers sensibles, outils de scan.
  • Lève des alertes (attaques répétées, connexions échouées répétées, accès refusés répétés) avec conseils.
  • Dashboard : vue d'ensemble, alertes filtrables, détail, IP bloquées, journal, réglages.
  • Mails : alerte immédiate pour une attaque bloquée, résumé périodique des autres.
  • Alerte seulement par défaut : le blocage automatique doit être activé explicitement.

Prérequis : PHP 8.0+, CodeIgniter 4.4+ ou Laravel 10+.

Laravel

composer require ikwook/sentinel-shield
php artisan sentinel:install      # publie la config + migre

Le provider, le middleware global, la tâche planifiée (sentinel:scan toutes les 5 min, il faut schedule:run en cron) et l'écoute des échecs de connexion (Illuminate\Auth\Events\Failed) sont automatiques.

Le dashboard (/security-alerts) est fermé par défaut. Ouvrez-le avec une habilitation :

Gate::define('viewSentinelShield', fn ($user) => $user->is_admin);

Mails : SENTINEL_MAIL_ENABLED=true, SENTINEL_MAIL_TO=secu@exemple.com (utilise votre configuration Mail).

CodeIgniter 4

composer require ikwook/sentinel-shield
php spark sentinel:install        # migrations du package

Le filtre global, les routes et les commandes sont découverts automatiquement. Ajoutez au cron : */5 * * * * php /chemin/spark sentinel:scan.

Le dashboard est fermé par défaut. Créez une classe AccessGate :

class AdminGate implements \Ikwook\SentinelShield\Contracts\AccessGate
{
    public function allows(): bool { return session('role') === 'admin'; }
}

puis dans .env : sentinelshield.gate = 'App\Libraries\AdminGate'.

Autres options .env : sentinelshield.autoBlock, sentinelshield.mailEnabled, sentinelshield.mailTo, sentinelshield.mailFrom, sentinelshield.appName, sentinelshield.uiPrefix, sentinelshield.dbGroup. Les seuils se règlent via Config\SentinelShield::$settings (voir Core\Settings::DEFAULTS).

Échecs de connexion (à appeler dans votre code d'authentification) :

helper('sentinel');
sentinel_login_failed($username);   // et sentinel_access_denied() pour un accès refusé

Sécurité et limites à connaître

  • Proxy inverse / CDN : l'IP vue par l'application doit être la vraie IP du client (trustedProxies Laravel, Config\App::$proxyIPs CI4). Sinon toutes les attaques semblent venir du proxy. Les IP privées et 127.0.0.1 ne sont jamais bloquées automatiquement.
  • La détection repose sur des signatures dans l'URL, la query et les formulaires (motifs stricts). Ce n'est pas un WAF : elle complète, ne remplace pas, les requêtes préparées, l'échappement et la mise à jour de vos dépendances.
  • Les valeurs suspectes ne sont pas conservées ; seules les catégories, l'IP, la méthode et le chemin le sont.
  • Le package ne casse jamais la requête : toute erreur interne laisse passer la requête et est journalisée.
  • Le dashboard n'écrit que via formulaires protégés CSRF et refuse de bloquer votre propre IP.
  • Les corps JSON ne sont pas inspectés côté CodeIgniter.
  • Les dates sont stockées en UTC et affichées dans le fuseau de l'application.

Tests

composer install && vendor/bin/phpunit

Architecture

Dossier Rôle
src/Core Détecteur, moteur (Sentinel), règles, mail HTML — sans dépendance framework
src/Contracts Store, Mailer, AccessGate
src/Store QueryStore : SQL portable (MySQL, PostgreSQL, SQLite)
src/Ui Dashboard commun (PHP pur, sans build JS)
src/CodeIgniter Filtre, routes, commandes, migrations, config
src/Laravel ServiceProvider, middleware, commandes, migrations, routes

Licence MIT.