Position actuelle: Accueil> Derniers articles> Comment gérer Symlinks dans PHP RealPath?

Comment gérer Symlinks dans PHP RealPath?

gitbox 2025-06-04

Dans le développement quotidien de PHP, l'analyse des chemins de fichier est l'une des exigences communes. La fonction realPath () est un outil puissant pour obtenir des chemins absolus normalisés vers les fichiers, mais son comportement peut être déroutant lorsqu'il s'agit de liens symboliques. Cet article expliquera systématiquement le principe de travail de RealPath () et partagera des conseils pratiques sur la façon de l'utiliser correctement dans les projets réels pour gérer les liens symboliques.

1. Utilisation de base de RealPath ()

realPath () renvoie un chemin absolu normalisé d'un chemin. Cela signifie qu'il analysera des éléments tels que . , .. et des liens symboliques.

Exemple de code:

 $path = realpath('./myfolder/../link-to-file.txt');
echo $path;

Dans cet exemple, le ... sur le chemin sera analysé, et si le lien symbolique existe, il sera analysé dans le chemin réel.

2. RealPath () comportement pour les liens symboliques

Lorsque vous utilisez RealPath () pour un lien symbolique, il renvoie le chemin réel vers lequel le lien pointe, et non l'emplacement du lien lui-même. Ce n'est peut-être pas ce que vous voulez dans certains cas.

Par exemple:

 // Hypothèses link.txt est un lien symbolique,Orientation /data/files/realfile.txt
$resolvedPath = realpath('/var/www/html/link.txt');
echo $resolvedPath;

Si /var/www/html/link.txt est un SymLink, realPath () sort /data/files/realfile.txt au lieu de /var/www/html/link.txt .

3. RealPath () renvoie faux

RealPath () dépend de l'existence du chemin cible. Si un niveau dans le chemin n'existe pas, il retournera faux . Cela signifie qu'il ne peut pas être utilisé pour les chemins de fichier qui n'ont pas encore été créés .

Exemple:

 $nonExistent = realpath('/path/to/nonexistent/file.txt');
var_dump($nonExistent); // Sortir bool(false)

4. Conseils pratiques: comment utiliser en toute sécurité RealPath () pour gérer Symlik

1. Déterminez si le chemin existe

Avant d'appeler RealPath () , assurez-vous que le chemin existe:

 $path = '/var/www/html/link.txt';
if (file_exists($path)) {
    echo realpath($path);
} else {
    echo "Le chemin n'existe pas";
}

2. Obtenez l'emplacement du lien symbolique lui-même

Si vous souhaitez obtenir le chemin vers le lien symbolique lui-même au lieu de la cible à laquelle il pointe, vous pouvez utiliser readLink () :

 $link = '/var/www/html/link.txt';
if (is_link($link)) {
    echo readlink($link); // Retour à la cible de liaison
}

Pour obtenir le chemin absolu vers le lien symbolique lui-même , vous pouvez combiner dirname () et readLink () :

 $link = '/var/www/html/link.txt';
if (is_link($link)) {
    $target = readlink($link);
    $realTarget = realpath(dirname($link) . '/' . $target);
    echo $realTarget;
}

3. Personnalisez le chemin de l'analyse pour éviter les restrictions RealPath

Si vous souhaitez "analyser" le chemin qui lie symbolique lorsque le chemin n'existe pas, vous pouvez personnaliser la résolution:

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

$resolved = custom_realpath('/var/www/html/../html/link.txt');
echo $resolved;

Notez que cette méthode n'analyse pas les liens symboliques, mais ne fera que normaliser le. et . sur le chemin.

5. Exemples de scénarios d'application pratiques

Supposons que vous développez un navigateur de fichiers Web et que vous souhaitiez que le chemin téléchargé par l'utilisateur soit limité au répertoire / var / www / de données . Vous devez vous assurer que le chemin analysé est toujours dans ce répertoire:

 $base = realpath('/var/www/data');
$userPath = $_GET['path']; // Par exemple:link/to/file.txt
$fullPath = realpath($base . '/' . $userPath);

if ($fullPath && strpos($fullPath, $base) === 0) {
    echo "Permettre l'accès:$fullPath";
} else {
    echo "Chemin illégal";
}

Si link / to / file.txt est un lien symbolique, RealPath résout son emplacement cible. Vous devez confirmer que la cible analysée est toujours à l'intérieur de $ Base pour empêcher les attaques de traversée du répertoire.

6. Comparaison: realPath () vs dir vs getcwd ()

fonction Description de la fonction
realpath () Renvoie le chemin absolu, l'analyse des composants de liaison et de chemin d'analyse
__Dir__ Le répertoire où se trouve le fichier actuel, la décision de temps de compilation
getCwd () Répertoire de travail actuel, décision d'exécution

Lorsque vous utilisez des chemins, la sélection de la bonne fonction permet d'éviter la confusion du chemin, en particulier lorsqu'un environnement CLI et Web est mélangé.

7. Conclusion

RealPath () est un outil indispensable dans la gestion du chemin de fichier PHP, mais vous devez être prudent lors de la gestion des liens symboliques. Il peut être utilisé plus sûr en combinant des techniques IS_LINK () , readLink () et Path Verification. Ce n'est qu'en comprenant ses limites que nous pouvons écrire du code robuste sous des structures de système de fichiers complexes.

Pour plus d'exemples d'utilisation de chemins de fichiers PHP et de liens symboliques, veuillez vous référer à: https://gitbox.net/articles/php-symlink-realpath