7

PHPで簡単なディレクトリリストスクリプトを実装しています。

echoディレクトリハンドルを開いて結果を気ままに表示する前に、渡されたパスが安全であることを確認したいと思います。

$f = $_GET["f"];
if(! $f) {
    $f = "/";
}
// make sure $f is safe
$farr = explode("/",$f);
$unsafe = false;
foreach($farr as $farre) {
    // protect against directory traversal
    if(strpos($farre,"..") != false) {
        $unsafe = true;
        break;
    }
    if(end($farr) != $farre) {
        // make sure no dots are present (except after the last slash in the file path)
        if(strpos($farre,".") != false) {
            $unsafe = true;
            break;
        }
    }
}

これは、ユーザーが送信したパスが安全であることを確認するのに十分ですか、それとも攻撃から保護するために他にすべきことはありますか?

4

1 に答える 1

8

それはrealpath()あなたに役立つかもしれません。

realpath()すべてのシンボリックリンクを展開し、入力パス内の'/./''/../'および余分な'/'文字への参照を解決し、正規化された絶対パス名を返します。

ただし、この関数は、問題のパスが実際に存在することを前提としています。存在しないパスの正規化は実行されません。この場合、FALSEが返されます。

于 2009-05-11T09:21:36.773 に答える