PHP - Les bonnes pratiques¶
Cette fiche est une tentative de synthèse de bonnes pratiques pour l'utilisation du langage PHP. PHP - La bonne manière ira beaucoup plus loin en détaillant les différents points.
Pour la gestion des dépendances¶
-
Utiliser PHP composer pour :
- Décrire et télécharger facilement les dépendances dans
mon-projet/vendor
. - Générer un fichier
mon-projet/vendor/autoload.php
(un seulrequire autoload.php
sera alors nécessaire) - Pouvoir mettre en oeuvre des automatismes à l'installation ou mise à jour (voir PHP composer / Scripts)
- Décrire et télécharger facilement les dépendances dans
Pour la qualité¶
-
Utiliser PHPUnit pour développer des tests unitaires et fonctionnels
-
Choisir une convention de codage (ex : Symfony - Coding Standards).
- Utiliser PHP-CS-Fixer pour respecter automatiquement cette convention de codage.
-
Utiliser un outil d'analyse statique du code (ex : PHPStan, PHPMD,...)
-
Générer des journaux applicatifs :
- Dépendre de PsrLogLoggerInterface au niveau des classes
- Utiliser monolog/monolog pour instancier PsrLogLoggerInterface
Pour la scalabilité¶
Stocker localement uniquement des données spécifiques à l'instance :
-
Utiliser une base de données clé/valeur telle Redis pour le stockage des données des sessions.
-
Utiliser une abstraction telle league/flysystem pour le stockage des fichiers pour pouvoir basculer sur un stockage S3.
Pour la sécurité¶
-
Ne jamais faire confiance aux utilisateurs, toujours valider les données (la base...).
-
Pour éviter les injections XSS, toujours échapper les rendus en HTML :
- Utiliser un moteur de template tel TWIG qui est intégré au framework Symfony
- Utiliser ezyang/htmlpurifier si vous intégrer un éditeur HTML (CKEditor, TinyMCE,...)
-
Pour éviter les injections SQL en accédant aux bases SQL, ne pas construire une requête SQL avec des données arbitraires :
- Utiliser PHP PDO et les requêtes préparées
- Utiliser un ORM tel doctrine/orm
-
Ne pas exposer la racine d'un projet au niveau du serveur web :
- Exposer un dossier
mon-projet/public
contenant unindex.php
au niveau apache/nginx ("document root") - Faire un dossier
mon-projet/src
pour les classes - Faire un dossier séparé pour les fichiers de configuration (ex :
mon-projet/config
oumon-projet/app/config
)
- Exposer un dossier
-
Ne pas stocker les fichiers téléversés par des utilisateurs dans un dossier exposé par le serveur :
- Faire un dossier séparé pour stocker ces fichiers (ex :
mon-projet/data
ou/var/mon-projet-data
) - Streamer l'envoi du fichier lors du téléchargement en PHP
- Faire un dossier séparé pour stocker ces fichiers (ex :