Cas d'usage · PHP
Audit de code PHP : ce qu'Anatoly détecte.
Un agent qui lit chaque fichier .php de votre projet, identifie les pièges spécifiques au langage et au framework (Laravel, Symfony, WordPress, Drupal), et produit un rapport défendable.
Les pièges spécifiques à PHP
PHP a accumulé vingt ans d'historique. Trois classes de défauts dominent les audits que nous voyons passer.
1. Injection SQL via concaténation directe
Encore très répandu sur le code legacy : une requête construite par concaténation de chaînes, sans préparation ni binding. Les linters classiques ne voient ce piège que si l'utilisateur tape exactement $_GET à côté de mysql_query. Anatoly suit la propagation des variables sur plusieurs fichiers et flagge les chaînes d'appel où une entrée non assainie atteint une requête, même via trois fonctions intermédiaires.
2. Désérialisation unserialize() sur entrée non fiable
Pattern d'exécution de code à distance bien documenté (gadget chains type PHPGGC). PHPStan le détecte parfois si le paramètre est typé. Anatoly détecte aussi le cas où l'entrée passe par une session, un cookie ou une base de données contrôlable, ce qu'un linter strict de type ne tracke pas.
3. Magic methods qui cassent l'analyse statique
__get, __set, __call court-circuitent les checks de visibilité et de typage. Les outils basés sur l'AST ne raisonnent pas sur ce qui se passe quand un appel passe par __call dynamique. Un audit LLM lit la définition, suit ce qui pourrait être appelé, et flagge les contrats implicites qui mènent à des bugs silencieux.
Ce qu'Anatoly détecte sur PHP
- Injections SQL et command injection cross-fichiers (taint tracking sémantique, pas par règle).
- Désérialisation non sécurisée et gadgets d'exécution.
- Failles XSS dans les templates Blade, Twig, ou PHP brut.
- Configuration sensible exposée (clés API en dur, fichiers
.envversionnés, mots de passe en clair). - Sur-ingénierie : factories de factories, services qui wrappent un service qui wrappe une requête simple, design patterns appliqués là où une fonction suffit.
- Duplication sémantique : deux contrôleurs qui font la même chose avec des noms différents, deux helpers qui réimplémentent la même validation.
- Tests faibles ou absents sur les chemins critiques (paiement, authentification, autorisation).
- Documentation PHPDoc manquante ou désynchronisée avec la signature réelle.
Exemple de constat
# Finding · correction · NEEDS_FIX
File: app/Http/Controllers/UserController.php:47
Symbol: UserController::search
Evidence:
$query = "SELECT * FROM users WHERE name LIKE '%" . $request->q . "%'";
$rows = DB::select($query);
Reasoning:
Le paramètre $request->q remonte sans validation depuis une route
GET (routes/web.php:23). La concaténation directe dans une chaîne SQL
contourne la couche Eloquent. Un payload type %' OR '1'='1 retourne
toute la table.
Recommendation:
Utiliser bindings paramétrés:
DB::select('SELECT * FROM users WHERE name LIKE ?', ['%'.$q.'%'])
ou la query builder Eloquent: User::where('name', 'like', "%$q%")Frameworks supportés
- Laravel : Eloquent, middleware, jobs, Blade, queues. Anatoly comprend les conventions Laravel (service providers, scopes, policies).
- Symfony : services, Doctrine, Twig, Messenger. Calibration sur le PSR-12 et les bundles courants.
- WordPress : audit de plugins et de thèmes. Hooks, filtres, capacités, sanitization. Pertinent pour les audits de sécurité de plugins avant mise en marketplace.
- Drupal : modules custom, hooks Drupal, Render API.
- PHP brut : pas de framework, pas de problème. L'audit fonctionne avec une calibration plus générique.
Comparaison avec les outils PHP établis
- PHPStan, Psalm : analyse statique excellente sur les types. Ils ne détectent ni sur-ingénierie, ni duplication sémantique, ni jugement de qualité contextuel. Complémentaires d'Anatoly, pas concurrents.
- RIPS, Snyk PHP : SAST sécurité. Couvrent bien les CVE catalogués. Manquent les chaînes d'attaque qui combinent plusieurs fonctions, et n'évaluent pas la dette technique.
- SonarPHP : règles + AI CodeFix. Couverture large mais reste rule-based. Anatoly raisonne sur le contexte sémantique cross-fichiers, ce qu'un moteur de règles ne peut pas faire.
Pour le comparatif complet, voir audit de code IA vs revue de code IA en 2026.