2009-05-11 15 views
7

PHPで簡単なディレクトリリストスクリプトを実装しています。PHPでユーザ定義のパスが安全であることを確認する

ディレクトリハンドルを開く前に、渡されたパスが安全であることを確認し、結果をwilly-nillyで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; 
     } 
    } 
} 

ユーザーが送信パスが安全であることを確認するために、この十分ですか、私は攻撃から保護するために行う必要があり、他のものがありますか?

+1

foreach()内で変数を切り替える – Greg

+0

:Oこれを選択していただきありがとうございます。 –

答えて

9

realpath()が役に立ちます。

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

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

+0

渡されたパスでrealpath()を実行し、それが私の「安全な」ディレクトリの下にあるかどうかを確認しますか? –

+0

正確です。あなたはナンセンスのパスを返すので(または偽)、あなたはチェックとして単純な部分文字列の比較を行うことができます。 – Tomalak

+0

いいですね。ありがとう! –

関連する問題