Skip to content

Security Gate Agent

Vérifie la sécurité : OWASP Top 10, abus métier et contrôle d'accès (AuthZ).

Quand l'utiliser

  • Avant merge d'une feature avec données utilisateur
  • Ajout d'endpoint API
  • Manipulation de fichiers uploadés
  • Tout formulaire avec input utilisateur

Quand ne pas l'utiliser

  • Modification de style ou UI pure
  • Documentation
  • Configuration d'environnement (mais vérifier les secrets)

Entrées requises

EntréeSource
Code sourceFichiers modifiés
API ContractEndpoints, auth requise
Feature SpecRègles métier, rôles
Routes/PoliciesFichiers Laravel

Sortie attendue

markdown
## Security Gate: [Nom du module]

### OWASP Check

| Catégorie | Statut | Vérification |
|-----------|--------|--------------|
| A01 - Broken Access Control | OK/KO | [Détail] |
| A02 - Crypto Failures | OK/KO | [Détail] |
| A03 - Injection | OK/KO | [Détail] |
| A04 - Insecure Design | OK/KO | [Détail] |
| A05 - Security Misconfiguration | OK/KO | [Détail] |
| A06 - Vulnerable Components | OK/KO | [Détail] |
| A07 - Auth Failures | OK/KO | [Détail] |
| A08 - Data Integrity | OK/KO | [Détail] |
| A09 - Logging Failures | OK/KO | [Détail] |
| A10 - SSRF | OK/KO | [Détail] |

### Contrôle d'accès (AuthZ)

| Ressource | Action | Règle appliquée |
|-----------|--------|-----------------|
| Invoice | view | Owner only (Policy) |
| Invoice | delete | Owner + Admin |

**Standard Laravel :**
- Policy obligatoire pour chaque ressource protégée (`Policies/InvoicePolicy.php`)
- FormRequest `authorize()` doit déléguer à la Policy ou être cohérent avec elle
- Controller : `$this->authorize('view', $invoice)` ou via FormRequest

### Permissions frontend = backend

Le frontend **ne décide jamais** des autorisations : il reflète les permissions du backend.

| Règle | Explication |
|-------|-------------|
| Backend = source de vérité | Toutes les permissions sont définies et vérifiées côté serveur |
| Frontend = miroir | Le frontend affiche/masque les éléments selon les permissions reçues de l'API |
| Pas de hardcode | Interdit : `if (user.role === 'admin')` côté frontend |
| API permissions | L'API expose les abilities via `/api/me` ou endpoint dédié |

**Pattern recommandé :**
```typescript
// Frontend Next.js - utiliser les permissions de l'API
const { can } = usePermissions(); // hook qui consomme /api/me

// Bon : permission vient de l'API
{can('invoices.create') && <CreateButton />}

// Mauvais : hardcode de rôle
{user.role === 'admin' && <CreateButton />}

Abus métier

Scénario d'abusMitigation
[Scénario 1][Protection]

Actions correctives

  • [ ] [Action si KO]

Verdict

[PASS | FAIL]


## Andon (STOP)

::: danger Conditions bloquantes
- Endpoint sans middleware auth sur données privées
- Query SQL construite par concaténation (injection)
- Input utilisateur affiché sans échappement (XSS)
- Upload de fichier sans validation de type
- Secret/token hardcodé dans le code
- Pas de Policy Laravel sur ressource protégée
- FormRequest `authorize()` incohérent avec la Policy
- AuthZ implicite (pas de `$this->authorize()` ni Policy check)
- CORS permissif (`*`) en production
- Frontend hardcode des rôles/permissions au lieu de consommer l'API (`if role === 'admin'`)
- Permissions UI non synchronisées avec les Policies backend
:::

## Checklist Done

```markdown
- [ ] Tous les endpoints protégés par middleware auth
- [ ] Policies Laravel sur chaque ressource sensible
- [ ] Policy + FormRequest authorize() cohérents
- [ ] Test minimal d'autorisation (accès refusé si non owner)
- [ ] Validation FormRequest sur tous les inputs
- [ ] Pas de SQL brut avec variables utilisateur
- [ ] Upload : validation MIME + taille + extension
- [ ] Pas de secret dans le code source
- [ ] CORS configuré par domaine autorisé
- [ ] Rate limiting sur endpoints sensibles
- [ ] Logs d'accès sur actions critiques
- [ ] Permissions frontend consomment l'API (pas de hardcode de rôles)
- [ ] API expose les abilities utilisateur (`/api/me` ou équivalent)

Exemple minimal

markdown
## Security Gate: Module Export PDF

### OWASP Check

| Catégorie | Statut | Vérification |
|-----------|--------|--------------|
| A01 - Broken Access Control | OK | Policy InvoicePolicy@view |
| A03 - Injection | OK | Pas de SQL dynamique |
| A07 - Auth Failures | OK | Middleware auth:sanctum |

### Contrôle d'accès (AuthZ)

| Ressource | Action | Règle appliquée |
|-----------|--------|-----------------|
| Invoice | downloadPdf | InvoicePolicy::view (owner) |

### Abus métier

| Scénario d'abus | Mitigation |
|-----------------|------------|
| Téléchargement massif de PDF | Rate limit 10/min |
| Accès facture autre utilisateur | Policy check user_id |

### Actions correctives
- [x] Aucune action requise

### Verdict
PASS

Ressources