Comment PHP Prévient les Attaques par Injection SQL, CSRF et XSS

La sécurité web est une préoccupation cruciale pour chaque développeur PHP. Les injections SQL, les attaques CSRF (Cross-Site Request Forgery) et XSS (Cross-Site Scripting) sont des menaces de sécurité courantes. Cet article explique comment prévenir ces attaques en PHP.

Prévention des Injections SQL

Utilisation des Requêtes Préparées

L'utilisation des requêtes préparées est l'une des méthodes les plus efficaces pour prévenir les injections SQL. Les requêtes préparées séparent la structure de la requête SQL des données, empêchant ainsi l'injection de code SQL malveillant.

Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
php
// Utilisation des requêtes préparées avec PDO
$pdo = new PDO("mysql:host=localhost;dbname=mabase", "nom_utilisateur", "mot_de_passe");
 
// Utilisation des placeholders nommés
$statement = $pdo->prepare("SELECT * FROM utilisateurs WHERE nom_utilisateur = :nom_utilisateur");
$statement->bindParam(':nom_utilisateur', $nom_utilisateur);
$nom_utilisateur = $_POST['nom_utilisateur'];
$statement->execute();


Ne Jamais Faire Confiance aux Entrées Utilisateur

Valider et filtrer les entrées utilisateur est crucial. Utilisez des fonctions de filtre pour assurer que le type d'entrée correspond au type attendu et validez lorsque nécessaire.


Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
// Utilisation de filter_var pour filtrer les entrées
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
if ($email === false) {
    // Adresse email invalide
}

Prévention des Attaques CSRF

Utilisation des Jetons CSRF

Générez un jeton CSRF unique pour chaque session utilisateur et incluez-le dans les formulaires. Lors de la soumission du formulaire, vérifiez que le jeton correspond à la session actuelle de l'utilisateur.


Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
// Génération du jeton CSRF
$csrfToken = bin2hex(random_bytes(32));
$_SESSION['csrf_token'] = $csrfToken;
 
// Inclusion du jeton CSRF dans le formulaire
echo '<input type="hidden" name="csrf_token" value="' . $csrfToken . '">';
 
// Validation du jeton CSRF
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
    // Attaque CSRF détectée
    die('Jeton CSRF invalide');
}


Politique de Même Origine

Assurez-vous que votre application adhère à la politique de même origine, qui n'autorise pas les pages de différentes origines à accéder directement à vos interfaces. Utilisez des en-têtes CORS pour restreindre les origines autorisées.


Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
// Définir les en-têtes CORS dans la réponse
header("Access-Control-Allow-Origin: https://domaine-de-confiance.com");


Prévention des Attaques XSS

Échappement des Sorties

Avant d'insérer des entrées utilisateur dans le HTML, utilisez la fonction `htmlspecialchars` pour échapper les données et prévenir les attaques XSS.


Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
// Échapper la sortie
echo htmlspecialchars($_GET['user_input'], ENT_QUOTES, 'UTF-8');


Politique de Sécurité de Contenu (CSP)

Utilisez la Politique de Sécurité de Contenu pour définir les ressources autorisées et restreindre l'exécution des scripts, améliorant ainsi la prévention des attaques XSS.

Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
// Définir les en-têtes de la Politique de Sécurité de Contenu
header("Content-Security-Policy: default-src 'self'");


Recommandations Générales de Sécurité

Rester à Jour : Maintenez PHP, les bases de données et d'autres composants critiques à jour pour garantir que les vulnérabilités connues sont corrigées.
Gestion des Erreurs : Configurez la gestion des erreurs pour afficher des informations suffisantes aux développeurs pour déboguer, mais désactivez les messages d'erreur détaillés en production.
Sécurité des Sessions : Utilisez une gestion sécurisée des sessions, assurez-vous que les ID de session sont générés aléatoirement et utilisez HTTPS pour protéger les informations sensibles en transit.
Téléchargements de Fichiers : Vérifiez et validez les fichiers téléchargés, n'autorisez que les types de fichiers sûrs et stockez les fichiers téléchargés dans des emplacements sécurisés.
Stockage des Mots de Passe : Utilisez des algorithmes de hachage (par exemple, bcrypt) pour stocker les mots de passe et ajoutez des sels appropriés.
Validation des Entrées : Effectuez la validation des entrées côté serveur et ne vous fiez pas uniquement à la validation côté client, car elle peut être facilement contournée.
Journalisation : Mettez en œuvre une journalisation complète pour enquêter sur les incidents de sécurité lorsqu'ils se produisent.