📘 Chapitre 6 – Bonnes pratiques pour manipuler des données en toute sécurité
1. 🎯 Objectif pédagogique
Appliquer les bonnes pratiques de sécurité lors de l’utilisation de PHP et PDO pour éviter les failles comme les injections SQL et sécuriser les opérations CRUD.
2. 📚 Concepts abordés
- Validation et nettoyage des données utilisateur (
filter_var
,htmlspecialchars
) - Utilisation systématique des requêtes préparées
- Gestion des erreurs et logs (sans divulguer les messages sensibles)
- Droits d’accès limités pour l’utilisateur MySQL
- Sauvegarde et prévention des pertes de données
3. 🧠 Explication théorique
Une application web doit toujours valider et nettoyer les données reçues (ex. via formulaires). Exemple de validation :
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
Les requêtes préparées empêchent les attaques par injection SQL en évitant l’exécution directe des données reçues. La gestion des erreurs doit se faire par logs (fichiers) plutôt que par affichage direct sur la page en production.
4. 🛠 Tutoriel pratique
Résumé du travail : Améliorer un script PHP pour sécuriser les données lors de l’insertion.
Arborescence projet :
projet_bdd/
├── connexion.php
└── ajout_utilisateur_secure.php
Étape 1 : Valider les entrées
<?php
require 'connexion.php';
$nom = htmlspecialchars(trim($_POST['nom']));
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
if (!$email) {
die("Email invalide !");
}
Étape 2 : Utiliser des requêtes préparées
$stmt = $pdo->prepare("INSERT INTO Utilisateur (nom, email) VALUES (:nom, :email)");
$stmt->execute([
'nom' => $nom,
'email' => $email
]);
echo "Utilisateur ajouté avec succès.";
Étape 3 : Gérer les erreurs sans fuite d’informations
try {
// Code d’insertion
} catch (PDOException $e) {
file_put_contents('logs/errors.log', $e->getMessage(), FILE_APPEND);
echo "Une erreur est survenue. Contactez l’administrateur.";
}
Étape 4 : Restreindre les droits MySQL
- Créer un utilisateur MySQL avec des droits limités (
SELECT
,INSERT
,UPDATE
,DELETE
) plutôt queALL PRIVILEGES
.
5. 🧾 Résumé et points-clés
- Toujours valider et nettoyer les données utilisateur.
- Utiliser prepare() + execute() pour toutes les requêtes SQL.
- Les messages d’erreur sensibles ne doivent pas apparaître côté client.
- Les utilisateurs MySQL doivent avoir des droits restreints pour limiter les risques.