5

クエリ文字列を介して設定されたファイル パスが目的のサブディレクトリの外に出ないようにしたいと考えています。現在、次のことを確認しています。

  1. /ユーザーが絶対パスを指定できないようにするため、パスは " " で始まりません。
  2. ..ユーザーが目的のサブディレクトリの外にあるパスを指定できないようにするため、パスには " " が含まれていません。
  3. :URL (つまり、" http://"、" ftp://" など)の使用を防ぐため、パスには " " が含まれていません。このスクリプトを Windows サーバーで実行した場合 (可能性は低い)、ドライブ指定子 (つまり " C:\") で始まる絶対パスも防止されます。注: コロンが Unix ファイル名で有効な文字であることは承知していますが、ファイル名でコロンを使用することはありません。
  4. パスが " " で始まっていません\。Windows サーバーで実行することに気が変わった場合に備えて、これにより Windows ネットワーク パス (つまり " \\someserver\someshare") が指定されなくなります。繰り返しますが、バックスラッシュが有効な Unix ファイル名文字であることは承知していますが、ファイル名には使用しません。

これらのチェックは十分ですか?

バックグラウンド

ユーザーに表示するサンプル ソース ファイルへのパスを (クエリ文字列を介して) 取得する PHP スクリプトがあります。view_sample.php?path=accounting_app/report_view.phpそれで、「 」や「 」のようなリンクを彼らに与えるかもしれませんview_sample.php?path=ajax_demo/get_info.js

スクリプトは基本的に次のようになります。

$path = $_GET['path'];
if(path_is_valid($path) && is_file("sample/$path"))
{
  header('Content-Type: text/plain');
  readfile("sample/$path");
}

私の懸念は、悪意のあるユーザーが URL を見て「 」のようなことを試み、「サンプル」ディレクトリにないview_sample.php?path=../../database/connection_info.phpファイルにアクセスしようとすることです。

上記で定義した 4 つのチェック (path_is_valid()関数に実装される) は、悪意のあるユーザーをロックアウトするのに十分でしょうか? (また、相対パスを先頭に追加しているため、チェック 1、3、および 4 は基本的に無関係だと思いますが、これを行わなかった場合、チェックは十分でしょうか?)

4

3 に答える 3

10

電話

$path = realpath("sample/$path");

次に、結果のパスが期待するディレクトリで始まることを確認します。

于 2009-01-19T04:50:43.900 に答える
6
<?php
    // Current path information
    $path = $_GET['path'];
    $vroot = "sample";

    // Validate that the $path is a subfolder of $vroot
    $vroot = realpath($vroot);
    if(substr(realpath($path), 0, strlen($vroot)) != $vroot or !is_dir($path)) {lid!
        exit("Invalid path");
    } else {
       echo "Ah, everything is alright!";
    }
?>
于 2009-01-19T05:39:52.210 に答える