Maison >développement back-end >tutoriel php >Comment PHP peut-il empêcher la traversée de répertoires tout en autorisant les chemins relatifs ?

Comment PHP peut-il empêcher la traversée de répertoires tout en autorisant les chemins relatifs ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-05 02:01:07870parcourir

How Can PHP Prevent Directory Traversal While Allowing Relative Paths?

Maintenir l'intégrité des répertoires en PHP : empêcher la traversée des répertoires tout en autorisant les chemins

Dans le domaine du développement Web, protéger les entrées des utilisateurs contre les tentatives malveillantes est primordial. L'un de ces problèmes survient lors du traitement des chemins en PHP, en particulier lorsque vous tentez de restreindre la traversée de répertoires tout en acceptant les chemins relatifs.

Considérez le scénario suivant : vous disposez d'un chemin de base de "/whatever/foo/" et souhaitez autoriser les utilisateurs doivent spécifier les chemins relatifs à celui-ci en utilisant $_GET['path']. Cependant, vous devez les empêcher d'exploiter des vulnérabilités telles que l'accès à des fichiers en dehors du répertoire prévu.

Les méthodes traditionnelles comme la recherche de séquences telles que "..." et ".." dans le chemin fourni par l'utilisateur sont insuffisantes, car ils peuvent être contournés. Heureusement, une solution plus robuste existe.

Exploiter les chemins réels avec realpath()

Pour empêcher efficacement la traversée de répertoires tout en autorisant les chemins relatifs, envisagez d'utiliser realpath(). Cette fonction résout un chemin donné vers son emplacement physique absolu, en prenant en compte les liens symboliques, "." et les références ".." et autres répertoires virtuels.

L'extrait de code suivant illustre cette approche :

$basepath = '/foo/bar/baz/';
$realBase = realpath($basepath);

$userpath = $basepath . $_GET['path'];
$realUserPath = realpath($userpath);

if ($realUserPath === false || strpos($realUserPath, $realBase) !== 0) {
    //Directory Traversal!
} else {
    //Good path!
}

Tout d'abord, $realBase est obtenu en appliquant realpath() au chemin de base , en s'assurant qu'il reflète fidèlement son emplacement physique. Ensuite, $realUserPath est déterminé en concaténant le chemin de base et le chemin fourni par l'utilisateur, puis en résolvant son chemin physique réel à l'aide de realpath().

Surtout, nous comparons $realUserPath à $realBase. Si $realUserPath équivaut à false (indiquant un chemin invalide ou inexistant), ou s'il ne commence pas par $realBase, une tentative de traversée de répertoire est identifiée. À l'inverse, si $realUserPath s'initie avec $realBase, cela signifie un chemin autorisé.

En employant realpath(), vous bénéficiez d'une méthode fiable pour empêcher la traversée de répertoires tout en autorisant les chemins relatifs en PHP, protégeant ainsi efficacement votre application contre les logiciels malveillants. saisie et en préservant l'intégrité de votre structure de répertoires.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn