Sécurité des applications PHP : vulnérabilités courantes et solutions

1. Injection SQL

Problème : Insertion de requêtes SQL malveillantes via des entrées utiliasteur, compromettant les bases de données.

Protections :

  • Privilégier les requêtes paramétrées avec PDO ou MySQLi
  • Éviter la concaténation directe dans les requêtes SQL
// Exemple avec PDO
$connexion = new PDO('mysql:host=serveur;dbname=ma_base', 'identifiant', 'motdepasse');
$requete = $connexion->prepare('SELECT * FROM clients WHERE email = :email');
$requete->bindValue(':email', $_POST['email']);
$requete->execute();
$donnees = $requete->fetchAll();

2. Cross-Site Scripting (XSS)

Problème : Exécution de scripts malveillants dans le navigateur des utilisateurs via du contenu non filtré.

Protections :

  • Échapper systématiquement les sorties HTML
  • Implémenter une politique de sécurité de contenu (CSP)
// Échappement des données
print htmlspecialchars($contenu_utilisateur, ENT_QUOTES | ENT_HTML5, 'UTF-8');

3. Cross-Site Request Forgery (CSRF)

Problème : Forçage des utilisateurs à exécuter des actions non désirées via leur session authentifiée.

Protectinos :

  • Utiliser des jetons anti-CSRF uniques par session
  • Valider l'origine des requêtes critiques
// Génération et vérification de jeton
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (!hash_equals($_SESSION['jeton_csrf'], $_POST['jeton'])) {
        exit('Requête invalide');
    }
}
$_SESSION['jeton_csrf'] = bin2hex(random_bytes(32));

4. Inclusion de fichiers

Problème : Chargement non contrôlé de fichiers locaux ou distants via des paramètres utilisateur.

Protections :

  • Restreindre les inclusions avec une liste blanche
  • Configurer open_basedir dans php.ini
// Validation par liste blanche
$fichiers_autorises = ['accueil.php', 'contact.php'];
$fichier = basename($_GET['fichier']);
if (in_array($fichier, $fichiers_autorises, true)) {
    include __DIR__ . "/$fichier";
}

5. Détournement de session

Problème : Vol d'identifiants de session pour usurper des comptes utilisateurs.

Protections :

  • Activer les flags Secure et HttpOnly pour les cookies
  • Régénérer les identifiants de session après authentification
// Configuration sécurisée
session_set_cookie_params([
    'httponly' => true,
    'secure' => true
]);
session_start();
session_regenerate_id();

6. Validation des entrées

Problème : Exploitation de données non validées pour des attaques diverses (commandes système, uploads malveillants).

Protections :

  • Filtrer et valider strictement toutes les entrées
  • Contrôler les types MIME des fichiers uploadés
// Validation d'email
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
if (!$email) {
    throw new Exception('Format email invalide');
}

// Restrictions d'upload
$extensions_permises = ['jpg', 'png'];
$extension = pathinfo($_FILES['fichier']['name'], PATHINFO_EXTENSION);
if (in_array($extension, $extensions_permises, true)) {
    move_uploaded_file($_FILES['fichier']['tmp_name'], 'chemin_securise/fichier.' . $extension);
}

7. Configuration serveur

Problème : Exposition d'informations sensibles via des paramètres PHP inadaptés.

Protections :

  • Désactiver l'affichage des erreurs en production (display_errors=Off)
  • Maintenir PHP et ses dépendances à jour

Bonnes praitques fondamentales

  • Principe du moindre privilège pour les comptes de base de données
  • Hachage robuste des mots de passe (password_hash/password_verify)
  • Audits réguliers avec outils comme OWASP ZAP
  • Formation continue sur les risques OWASP Top 10

Étiquettes: PHP Sécurité injection-sql XSS CSRF

Publié le 12 juillet à 18h49