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.
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.
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).
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 :
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 :
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.