Position actuelle: Accueil> Derniers articles> Comment utiliser PHP RealPath pour obtenir le véritable chemin d'un fichier et éviter les problèmes de liaison doux?

Comment utiliser PHP RealPath pour obtenir le véritable chemin d'un fichier et éviter les problèmes de liaison doux?

gitbox 2025-05-29

1. Introduction à la fonction realPath ()

La fonction RealPath () de PHP est utilisée pour renvoyer le chemin absolu du chemin spécifié et analyser les liens symboliques, les chemins relatifs (tels que . Et .. ) et ainsi de suite:

 $realPath = realpath('/var/www/html/../index.php');
echo $realPath;

Ce code publiera le chemin absolu de /var/www/index.php .

2. Problèmes causés par des liens souples

Un lien souple est une référence à un autre fichier ou répertoire. Il est très courant dans les systèmes Linux, en particulier dans les environnements de déploiement (comme l'utilisation de la racine Nginx pour pointer vers un répertoire de liaison douce). Le problème est:

  • realPath () analysera et renverra le chemin réel indiqué par le lien souple;

  • Si vous comptez sur des chemins de contrôle d'autorisation ou de correspondance du chemin, le chemin renvoyé par realPath () peut être incompatible avec vos attentes;

  • Dans certains scénarios (tels que la vérification de la liste blanche), le chemin après la résolution de liaison souple peut contourner vos limites.

Exemple :

Supposons qu'il existe la structure de fichiers suivante:

 /data/app/storage/real/
/data/app/storage/link -> /data/app/storage/real/

Le code est le suivant:

 $path = '/data/app/storage/link/file.txt';
echo realpath($path);

La sortie sera:

 /data/app/storage/real/file.txt

Pour le moment, si vous vous attendez à ce que le chemin de retour contienne le lien de mots, le comportement de RealPath () ne correspond pas à votre objectif.

3. Comment éviter les problèmes causés par des liens souples

1. Évitez RealPath ()

Si vous souhaitez uniquement obtenir le chemin absolu et ne vous souciez pas de l'analyse de la liaison souple, vous pouvez utiliser la combinaison suivante de méthodes pour l'obtenir:

 $absolutePath = rtrim(getcwd(), '/') . '/' . ltrim($relativePath, '/');

Cela ne résout pas le lien souple, conservant la structure d'origine du chemin que vous passez.

2. Utilisez readLink () pour déterminer s'il s'agit d'un lien souple

Vous pouvez déterminer si le chemin est un lien souple et gérer la logique par vous-même:

 if (is_link($path)) {
    $target = readlink($path);
    echo "Ceci est un lien doux,Le but est:" . $target;
}

Vous pouvez décider de suivre le lien en fonction des exigences du projet ou de conserver le chemin d'origine.

3. Normaliser manuellement le chemin (pas de résolution de liaison souple)

Voici une fonction de normalisation de chemin qui ne dépend pas de realPath () :

 function normalizePath($path) {
    $parts = [];
    foreach (explode('/', $path) as $segment) {
        if ($segment === '' || $segment === '.') {
            continue;
        }
        if ($segment === '..') {
            array_pop($parts);
        } else {
            $parts[] = $segment;
        }
    }
    return '/' . implode('/', $parts);
}

$input = '/data/app/storage/link/../link/file.txt';
echo normalizePath($input);

Cela nettoie le . et .. dans le chemin, mais ne résout pas le lien souple.

4. Comparez le chemin d'origine et le chemin RealPath

Pendant le contrôle de l'autorisation, le chemin d'origine et le chemin realPath () peuvent être enregistrés en même temps pour faire la comparaison de l'autorisation:

 $originalPath = '/data/app/storage/link/file.txt';
$realPath = realpath($originalPath);

if (strpos($realPath, '/data/app/storage/real/') !== 0) {
    die('Ce chemin n'est pas autorisé');
}

Cette approche convient pour traiter le problème que les liens souples pointent vers des chemins sensibles.

4. Suggestions d'application pratiques

  • Téléchargez la vérification du répertoire : vérifiez si le chemin d'origine est légal avant d'utiliser RealPath () et assurez-vous que le chemin est toujours dans la plage admissible après sa résolution.

  • Débogage de l'environnement de développement : il existe de nombreux liens souples utilisés dans l'environnement de déploiement. Assurez-vous de prêter attention aux changements de chemin lors du débogage pour éviter les bogues causés par des chemins incohérents.

  • Développement du cadre : si vous développez un cadre, il est recommandé de fournir un outil de résolution de chemin personnalisé au lieu de compter directement sur realPath () .

5. Résumé

Le RealPath () de PHP peut en effet apporter l'uniformité du chemin et la simplicité lors du traitement des liens souples, mais il peut également provoquer une déconnexion du chemin en raison du comportement d'analyse. Pour les applications ayant des exigences de sécurité et de cohérence élevées, il est recommandé d'adopter une stratégie de traitement de chemin à grain plus fin basé sur les besoins réels, et de mettre en œuvre la logique d'analyse du chemin vous-même si nécessaire pour éviter de s'appuyer uniquement sur RealPath () .