Position actuelle: Accueil> Derniers articles> Vulnérabilités de sécurité et protection PHP courantes : un guide pratique sur l'injection, l'inclusion et le téléchargement de fichiers

Vulnérabilités de sécurité et protection PHP courantes : un guide pratique sur l'injection, l'inclusion et le téléchargement de fichiers

M66 2025-10-28

Introduction

Avec le développement d'Internet, les sites Web basés sur PHP occupent encore un grand nombre de scénarios d'application. En raison de la flexibilité et de la popularité de PHP, les méthodes d'écriture non sécurisées peuvent facilement être exploitées par des attaquants. Cet article présente les méthodes d'utilisation et les idées de défense de plusieurs vulnérabilités courantes d'un point de vue pratique, et conserve l'exemple de code pour une compréhension et une réparation faciles (les blocs de code sont conservés tels quels autant que possible, et seule la structure HTML déroutante est nettoyée). Les informations relatives à la promotion du site ou aux liens internes ont été supprimées de l'article.

Exemples d'injection SQL et protection

Description : les attaquants injectent des fragments SQL malveillants dans l'entrée et modifient la logique de requête d'origine pour contourner la vérification ou voler/falsifier les données.

 <?php
$id = $_GET['id'];

// Épissage SQL instruction de requête
$sql = "SELECT * FROM users WHERE id = " . $id;

// Exécuter la requête
$result = mysqli_query($conn, $sql);

// Traiter les résultats de la requête
// ...
?>

Problème : L'épissage direct des entrées de l'utilisateur entraînera une falsification de l'instruction. Par exemple, transmettre id=1 OR 1=1 rendra la condition toujours vraie, ce qui peut entraîner une fuite de données sensibles ou un contournement de l'authentification.

Suggestions de protection : utilisez des requêtes paramétrées (instructions prétraitées) ou ORM pour éviter de fusionner directement les entrées de l'utilisateur ; effectuer une vérification de type sur l'entrée (par exemple, en s'assurant que l'identifiant est un entier) ; gérer les messages d’erreur de manière appropriée pour éviter de divulguer des détails internes.

Le fichier contient des exemples de vulnérabilité et de protection

Description : lorsque le chemin contenant les fichiers n'est pas strictement contrôlé, un attaquant peut transmettre un chemin spécialement conçu pour inclure n'importe quel fichier, même un fichier distant (si la configuration le permet), conduisant à la divulgation de fichiers sensibles ou à l'exécution de code à distance.

 <?php
$page = $_GET['page'];

// Épissage文件路径并包含文件
include("pages/" . $page . ".php");

?>

Problème : Il n'y a aucune restriction sur le paramètre de page . Un attaquant peut accéder à la configuration sensible du répertoire de niveau supérieur via un chemin tel que page=../config , ou l'exécuter à l'aide d'un script après le téléchargement du fichier.

Suggestions de protection : n'incluez pas directement les chemins des utilisateurs ; utiliser un mécanisme de liste blanche pour limiter les noms de fichiers pouvant être inclus ; utilisez un répertoire de base et résolvez le chemin en un chemin absolu avant l'inclusion et vérifiez s'il se situe dans la plage autorisée ; désactivez les options de configuration PHP qui permettent l'inclusion à distance (telles que allow_url_include).

Exemples de vulnérabilités de téléchargement de fichiers et protection

Description : si la fonction de téléchargement de fichiers vérifie uniquement l'extension ou le nom du fichier, un attaquant peut télécharger un script exécutable déguisé et l'exécuter sur le serveur, obtenant ainsi des privilèges plus élevés.

 <?php
$targetDir = "uploads/";
$targetFile = $targetDir . basename($_FILES["fileToUpload"]["name"]);

// Vérifier le type de fichier
$fileType = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION));
if ($fileType != "jpg" && $fileType != "png" && $fileType != "jpeg" && $fileType != "gif") {
    exit("Autoriser uniquement le téléchargement de fichiers image!");
}

// Télécharger des fichiers
if(move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $targetFile)) {
    echo "Fichier téléchargé avec succès!";
} else {
    echo "Échec du téléchargement du fichier!";
}

?>

Problème : Un jugement basé uniquement sur l'extension de fichier n'est pas fiable. Les attaquants peuvent modifier l'extension ou forger des types MIME pour télécharger des scripts malveillants.

Suggestions de protection :

  • Effectuez la détection du contenu sur le fichier (par exemple en utilisant une bibliothèque de traitement d'image pour vérifier les informations réelles de l'en-tête de l'image), pas seulement l'extension ou le jugement de type MIME frontal.
  • Générez un nom de fichier aléatoire pour le fichier téléchargé et stockez-le dans un répertoire qui n'est pas directement accessible depuis le Web (ou configurez le serveur pour interdire l'exécution de scripts dans ce répertoire).
  • Limitez la taille et la vitesse des fichiers et vérifiez les autorisations des utilisateurs.
  • Dans les répertoires qui doivent être accessibles au public, assurez-vous que la configuration du serveur interdit l'analyse des types d'exécutables tels que PHP (par exemple via la configuration du serveur Web ou le placement de .htaccess).

Recommandations générales pour un développement et des opérations sécurisés

La sécurité ne peut pas être assurée en une seule opération. Il est recommandé d'adopter les pratiques suivantes pendant le développement, l'exploitation et la maintenance :

  • Les entrées ne sont toujours pas fiables : toutes les entrées externes sont vérifiées, filtrées et traitées selon le principe de la liste blanche.
  • Le principe du moindre privilège : essayez d'utiliser des comptes avec des autorisations limitées pour les comptes de base de données ; les autorisations du système de fichiers doivent être limitées aux autorisations minimales requises pour l’exécution.
  • Utilisez des bibliothèques et des frameworks modernes : essayez d'utiliser des frameworks ou des bibliothèques matures pour gérer les bases de données, l'authentification et les opérations sur les fichiers, et évitez d'implémenter vous-même des fonctions courantes.
  • Audit de code et analyse automatisée : effectuez des audits de code réguliers, introduisez des outils d'analyse statique et d'analyse dynamique et réparez rapidement les problèmes découverts.
  • Journaux et alertes : Capable de détecter et de répondre rapidement lorsqu'un comportement anormal se produit. Les journaux ne doivent pas contenir d'informations d'identification sensibles.

Conclusion

Cet article présente plusieurs problèmes de sécurité PHP typiques et leurs idées de protection. On espère que les développeurs pourront intégrer la sensibilisation à la sécurité dans tous les aspects des exigences, de la conception, de la mise en œuvre, de l’exploitation et de la maintenance. Pour chaque type de vulnérabilité de l’exemple, l’environnement réel peut être plus complexe. Il est recommandé de combiner les résultats de l’audit du code, de l’analyse automatisée et des tests d’intrusion pour des réparations ciblées.