ホームページ >バックエンド開発 >PHPチュートリアル >PHP は相対パスを許可しながらディレクトリ トラバーサルをどのように防ぐことができますか?

PHP は相対パスを許可しながらディレクトリ トラバーサルをどのように防ぐことができますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-05 02:01:07879ブラウズ

How Can PHP Prevent Directory Traversal While Allowing Relative Paths?

PHP でのディレクトリの整合性の維持: パスを許可しながらディレクトリ トラバーサルを防止する

Web 開発の領域では、悪意のある試みからユーザー入力を保護することが重要です。最も重要です。このような懸念の 1 つは、PHP でパスを処理するとき、特に相対パスに対応しながらディレクトリのトラバーサルを制限しようとするときに発生します。

次のシナリオを考えてみましょう。「/whatever/foo/」というベース パスがあり、これを許可したいと考えています。ユーザーは $_GET['path'] を使用して相対パスを指定します。ただし、意図したディレクトリ外のファイルにアクセスするなどの脆弱性が悪用されないようにする必要があります。

ユーザーが指定したパスで「...」や「..」などのシーケンスを検索するなどの従来の方法では不十分です。バイパスできるからです。幸いなことに、より堅牢なソリューションが存在します。

realpath() によるリアル パスの活用

相対パスを許可しながらディレクトリ トラバーサルを効果的に防止するには、realpath() の利用を検討してください。この関数は、シンボリックリンク「.」を考慮して、指定されたパスをその絶対的な物理的な場所に解決します。

次のコード スニペットは、このアプローチを示しています。

$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!
}

まず、ベース パスに realpath() を適用することで、$realBase が取得されます。 、物理的な位置を正確に反映していることを保証します。次に、ベース パスとユーザー指定のパスを連結することによって $realUserPath が決定され、その後、realpath() を使用して実際の物理パスが解決されます。

重要なのは、$realUserPath と $realBase を比較することです。 $realUserPath が false (無効または存在しないパスを示す) の場合、または $realBase で始まらない場合、ディレクトリ トラバーサルの試行が識別されます。逆に、$realUserPath が $realBase で始まる場合、それは許可されたパスを示します。

realpath() を使用すると、PHP で相対パスを許可しながらディレクトリ トラバーサルを防止する信頼性の高い方法が得られ、アプリケーションを悪意のあるものから効果的に保護できます。を入力し、ディレクトリ構造の整合性を維持します。

以上がPHP は相対パスを許可しながらディレクトリ トラバーサルをどのように防ぐことができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。