Maison >développement back-end >tutoriel php >Problèmes de sécurité PHP courants et comment les éviter
La sécurité est l'un des aspects les plus critiques du développement Web. PHP, étant l'un des langages de programmation côté serveur les plus utilisés, est souvent la cible d'attaques s'il n'est pas correctement sécurisé. Les développeurs doivent être conscients des vulnérabilités de sécurité courantes et mettre en œuvre les mesures nécessaires pour protéger leurs applications.
Dans cet article, nous explorerons certains des problèmes de sécurité PHP les plus courants et comment les atténuer.
Problème :
L'injection SQL se produit lorsqu'un attaquant est capable de manipuler des requêtes SQL en injectant du code SQL malveillant via les entrées de l'utilisateur. Si l'entrée utilisateur est directement incluse dans une requête SQL sans validation ou nettoyage approprié, cela peut permettre aux attaquants d'exécuter des commandes SQL arbitraires, compromettant potentiellement la base de données.
Comment prévenir :
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email'); $stmt->execute(['email' => $userEmail]);
En utilisant :email, la requête est préparée avec des espaces réservés et la valeur réelle est liée séparément, garantissant que la saisie de l'utilisateur n'est jamais directement insérée dans la requête.
Problème :
XSS se produit lorsqu'un attaquant injecte des scripts malveillants (généralement JavaScript) dans une page Web consultée par d'autres utilisateurs. Ce script peut être utilisé pour voler des cookies de session, rediriger les utilisateurs vers des sites malveillants ou exécuter des actions non autorisées au nom de l'utilisateur.
Comment prévenir :
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
Cela empêche tout code HTML ou JavaScript contenu dans la saisie utilisateur d'être exécuté par le navigateur.
Politique de sécurité du contenu (CSP) : mettez en œuvre un CSP pour limiter les types de contenu pouvant être chargés sur votre site Web et atténuer les attaques XSS.
Validation des entrées : désinfectez toujours les entrées de l'utilisateur, en particulier lors de l'acceptation de données pour la sortie HTML.
Problème :
CSRF est une attaque dans laquelle un utilisateur malveillant incite un autre utilisateur à effectuer des actions (comme changer son mot de passe ou effectuer un achat) sur une application Web sans son consentement. Cela se produit généralement lorsque l'attaquant effectue une demande non autorisée en utilisant la session authentifiée de la victime.
Comment prévenir :
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email'); $stmt->execute(['email' => $userEmail]);
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
Problème :
Permettre aux utilisateurs de télécharger des fichiers sans validation appropriée peut entraîner de graves vulnérabilités. Les attaquants pourraient télécharger des fichiers malveillants tels que des scripts PHP, qui pourraient être exécutés sur le serveur.
Comment prévenir :
// Generate CSRF token $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); // Include token in form echo '<input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">'; // Validate token on form submission if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) { die('CSRF token validation failed.'); }
Taille limite du fichier : définissez une limite de taille de fichier maximale pour les téléchargements afin d'empêcher les attaques par déni de service (DoS) via des fichiers volumineux.
Renommer les fichiers téléchargés : évitez d'utiliser le nom de fichier d'origine. Renommez les fichiers téléchargés en quelque chose d'unique pour empêcher les utilisateurs de deviner ou d'écraser les fichiers existants.
Stocker les fichiers en dehors de la racine Web : stockez les fichiers téléchargés dans des répertoires qui ne sont pas accessibles via le Web (c'est-à-dire en dehors du dossier public_html ou www).
Interdire les fichiers exécutables : n'autorisez jamais le téléchargement de fichiers .php, .exe ou d'autres types de fichiers exécutables. Même si vous validez le type de fichier, il vaut mieux éviter de manipuler des fichiers susceptibles d'exécuter du code.
Problème :
De mauvaises pratiques de gestion de session peuvent rendre votre application vulnérable aux attaques, telles que le détournement de session ou la fixation de session. Par exemple, les attaquants peuvent voler ou prédire les identifiants de session s'ils ne sont pas correctement protégés.
Comment prévenir :
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email'); $stmt->execute(['email' => $userEmail]);
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
Problème :
L'injection de commandes se produit lorsqu'un attaquant injecte des commandes malveillantes dans une commande système exécutée par exec(), shell_exec(), system() ou des fonctions similaires de PHP. Cela peut permettre à un attaquant d'exécuter des commandes arbitraires sur le serveur.
Comment prévenir :
Évitez d'utiliser les fonctions Shell : évitez d'utiliser des fonctions telles que exec(), shell_exec(), system() ou passthru() avec la saisie de l'utilisateur. Si vous devez utiliser ces fonctions, assurez-vous d'une validation et d'une désinfection appropriées de l'entrée.
Utilisez Escapeshellcmd() et Escapeshellarg() : Si des commandes shell doivent être exécutées, utilisez escapeshellcmd() et escapeshellarg() pour nettoyer les entrées de l'utilisateur avant de les transmettre à la ligne de commande.
// Generate CSRF token $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); // Include token in form echo '<input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">'; // Validate token on form submission if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) { die('CSRF token validation failed.'); }
Problème :
L'exposition de messages d'erreur sensibles peut révéler des informations sur la structure de votre application, qui peuvent être exploitées par des attaquants. Cela se produit souvent lorsque des messages d'erreur détaillés sont affichés aux utilisateurs.
Comment prévenir :
setcookie('session', $sessionId, ['samesite' => 'Strict']);
$allowedTypes = ['image/jpeg', 'image/png']; if (in_array($_FILES['file']['type'], $allowedTypes)) { // Proceed with file upload }
Problème :
Si vous utilisez WebSockets dans votre application PHP, les connexions WebSocket non sécurisées peuvent être détournées pour usurper l'identité des utilisateurs et envoyer des données malveillantes.
Comment prévenir :
Utilisez HTTPS pour les connexions WebSocket : assurez-vous que les connexions WebSocket sont établies via wss:// (WebSocket Secure) plutôt que ws:// pour chiffrer les données.
Valider les en-têtes d'origine : validez l'en-tête d'origine pour vous assurer que la demande provient d'un domaine autorisé.
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email'); $stmt->execute(['email' => $userEmail]);
Problème :
Le stockage des mots de passe des utilisateurs en texte brut ou l'utilisation d'algorithmes de hachage faibles peuvent entraîner de graves problèmes de sécurité si la base de données est compromise.
Comment prévenir :
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
La sécurité PHP est essentielle pour la protection de votre application et de ses utilisateurs. En comprenant et en atténuant les vulnérabilités courantes telles que l'injection SQL, XSS, CSRF, les problèmes de téléchargement de fichiers et les failles de gestion de session, vous pouvez améliorer considérablement la sécurité de votre application PHP.
L'adoption de bonnes pratiques telles que l'utilisation d'instructions préparées, la validation des entrées, l'utilisation de HTTPS et la gestion sécurisée des sessions et des mots de passe contribueront à prévenir les attaques les plus courantes. Restez toujours à jour avec les dernières pratiques de sécurité et auditez régulièrement votre application pour détecter les vulnérabilités potentielles.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!