Chapitre 30 : Sécurité Web
Protégez vos applications PHP contre les failles de sécurité courantes
1. Introduction à la sécurité Web
La sécurité Web est essentielle pour protéger les données, les utilisateurs et le bon fonctionnement de vos applications. PHP, en tant que langage serveur, doit gérer correctement les entrées, les sessions, et la base de données pour éviter les attaques.
2. Injections SQL
Problème : Lorsqu'un attaquant injecte du SQL malicieux via les champs de formulaire.
Solution : Toujours utiliser les requêtes préparées avec PDO.
$stmt->execute([$email]);
3. XSS (Cross-Site Scripting)
Problème : Un utilisateur injecte du code JavaScript malicieux.
Solution : Toujours échapper les données avec htmlspecialchars() :
4. CSRF (Cross-Site Request Forgery)
Problème : Un utilisateur malveillant force un autre utilisateur à exécuter une action à son insu.
Solution : Utilisez un jeton CSRF pour valider les requêtes :
$_SESSION['token'] = bin2hex(random_bytes(32));
// Vérification dans le formulaire
if ($_POST['token'] !== $_SESSION['token']) {
die("Requête invalide.");
}
5. Sécurisation des mots de passe
Utilisez toujours :
password_hash()pour enregistrer un mot de passepassword_verify()pour vérifier la correspondance
if (password_verify($motDePasse, $hash)) {
echo "Connexion réussie";
}
6. Autres bonnes pratiques
- Filtrer toutes les entrées utilisateur (
filter_input(),filter_var()) - Désactiver l'affichage des erreurs en production
- Utiliser HTTPS
- Limiter les permissions des fichiers et dossiers
- Gérer les permissions utilisateurs dans votre application
7. Exercice pratique : Sécurisez un formulaire de connexion
🎯 Objectif : Implémentez un formulaire de connexion sécurisé contre les attaques courantes.
Consignes :
- Créez un formulaire d'identification (email et mot de passe)
- Ajoutez un champ caché avec un token CSRF
- Échappez tous les champs à l'affichage avec
htmlspecialchars() - Utilisez
password_hash()etpassword_verify() - Protégez les requêtes avec des requêtes préparées PDO
Bonus :
- Ajoutez une temporisation ou un blocage après plusieurs échecs
- Utilisez un en-tête
Location:sécurisé pour rediriger après connexion
8. Résumé
- ✅ Injection SQL → Requêtes préparées
- ✅ XSS →
htmlspecialchars() - ✅ CSRF → Jeton sécurisé
- ✅ Mots de passe →
password_hash()/verify()
En suivant ces bonnes pratiques, vos applications PHP seront bien plus résistantes aux attaques.