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 = $pdo->prepare("SELECT * FROM users WHERE email = ?");
$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() :

echo htmlspecialchars($userInput);

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 :

// Génération du token
$_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 passe
  • password_verify() pour vérifier la correspondance
$hash = password_hash($motDePasse, PASSWORD_DEFAULT);
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() et password_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
Conseil : Cet exercice vous aidera à consolider les fondations de la sécurité dans vos futurs projets PHP.

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.