現在の位置: ホーム> 最新記事一覧> PHP RealPathでSymlinksを処理する方法は?

PHP RealPathでSymlinksを処理する方法は?

gitbox 2025-06-04

毎日のPHP開発では、ファイルパスの解析は一般的な要件の1つです。 RealPath()関数は、ファイルへの正規化された絶対パスを取得するための強力なツールですが、Symlinksを扱う場合、その動作は混乱する可能性があります。この記事では、 RealPath()の作業原則を体系的に説明し、実際のプロジェクトで正しく使用する方法に関する実用的なヒントを共有して、シンボリックリンクを処理します。

1。RealPathの基本的な使用()

RealPath()は、パスの正規化された絶対パスを返します。これは、次の要素を解析することを意味します..およびシンボリックリンク。

サンプルコード:

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

この例では、 ...パス内の...シンボリックリンクが存在する場合、実際のパスに解析されます。

2。SymbolicLinksのRealPath()動作

シンボリックリンクにRealPath()を使用すると、リンク自体の位置ではなく、リンクが指すリアルパスを返します。これは、場合によってはあなたが望むものではないかもしれません。

例えば:

 // 仮定 link.txt 象徴的なリンクです,指向 /data/files/realfile.txt
$resolvedPath = realpath('/var/www/html/link.txt');
echo $resolvedPath;

/var/www/html/link.txtがsymlink、 realpath() outputs /data/files/realfile.txtの代わりに/www/html/link.txtの場合。

3。RealPath()はfalseを返します

RealPath()は、ターゲットパスの存在に依存します。パス内のレベルが存在しない場合、虚偽を返します。これは、まだ作成されていないファイルパスに使用できないことを意味します。

例:

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

4。実用的なヒント:Symlinkを処理するためにRealPath()を安全に使用する方法

1.パスが存在するかどうかを判断します

RealPath()を呼び出す前に、パスが存在することを確認してください。

 $path = '/var/www/html/link.txt';
if (file_exists($path)) {
    echo realpath($path);
} else {
    echo "パスは存在しません";
}

2。シンボリックリンク自体の場所を取得します

それが指すターゲットの代わりに、シンボリックリンク自体へのパスを取得したい場合は、 readLink()を使用できます。

 $link = '/var/www/html/link.txt';
if (is_link($link)) {
    echo readlink($link); // リンクターゲットに戻ります
}

シンボリックリンク自体への絶対的なパスを取得するには、 dirname()readlink()を組み合わせることができます。

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

3.レアルパスの制限を避けるために、解析パスをカスタマイズします

パスが存在しないときにシンボリックリンクがリンクするパスを「解析」したい場合は、解像度をカスタマイズできます。

 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;

この方法はシンボリックリンクを解析するのではなく、正規化するだけであることに注意してくださいそしてパスで。

5。実用的なアプリケーションシナリオの例

Webファイルブラウザを開発しており、ユーザーがアップロードして/var/www/dataディレクトリに制限したいとします。解析されたパスがまだそのディレクトリにあることを確認する必要があります。

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

if ($fullPath && strpos($fullPath, $base) === 0) {
    echo "アクセスを許可します:$fullPath";
} else {
    echo "違法な道";
}

link/to/file.txtがSymlinkである場合、RealPathはターゲットの場所を解決します。ディレクトリのトラバーサル攻撃を防ぐために、解析されたターゲットがまだ$ベース内にあることを確認する必要があります。

6。比較:realpath()vs dir v getcwd()

関数関数の説明
realpath()絶対パスを返し、シンリンクとパスコンポーネントを解析します
__dir__現在のファイルが配置されているディレクトリ、コンパイル時間決定
getcwd()現在の作業ディレクトリ、ランタイム決定

パスを使用する場合、正しい関数を選択すると、特にCLIとWeb環境が混在している場合、パスの混乱を回避できます。

7。結論

RealPath()は、PHPファイルパス管理に不可欠なツールですが、シンボリックリンクを処理する際には注意する必要があります。 is_link()readlink() 、およびパス検証手法を組み合わせることで、より安全に使用できます。その制限を理解することによってのみ、複雑なファイルシステム構造の下に堅牢なコードを記述できます。

PHPファイルパスとシンボリックリンクの使用例については、https: //gitbox.net/articles/php-symlink-realpathを参照してください。