Lorsque vous travaillez avec des chemins relatifs, il est crucial de vous protéger contre les attaques de traversée de répertoire qui peuvent compromettre les informations système sensibles.
Considérez le scénario dans lequel vous avez un chemin de base de '/whatever/foo/' et devez autoriser les chemins relatifs en utilisant le Variable $_GET['chemin']. Cependant, des acteurs malveillants peuvent tenter d'exploiter ce mécanisme en injectant des séquences de traversée de chemin (comme '..' ou './') pour accéder à des répertoires restreints.
Pour empêcher efficacement la traversée de répertoire tout en autorisant les chemins relatifs, vous pouvez utilisez la technique suivante :
$basepath = '/foo/bar/baz/'; $realBase = realpath($basepath); $userpath = $basepath . $_GET['path']; $realUserPath = realpath($userpath); if ($realUserPath === false || strpos($realUserPath, $realBase) !== 0) { // Directory Traversal Attempt Detected } else { // Valid Path }
Cette méthode exploite la fonction realpath() pour déterminer les chemins physiques absolus des chemins de base et fournis par l'utilisateur. En comparant ces chemins absolus, vous pouvez vérifier que le chemin utilisateur ne traverse pas le chemin de base désigné. Si tel est le cas, realpath() renverra false ou un chemin incorrect, déclenchant la détection d'une tentative de traversée de répertoire.
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!