29

こんにちは、私の小さなプログラムを安全にして、潜在的な悪意のあるユーザーがサーバー上の機密ファイルを表示できないようにしたいと考えています。

    $path = "/home/gsmcms/public_html/central/app/webroot/{$_GET['file']}";


    if(file_exists($path)) {
        echo file_get_contents($path);
    } else {
        header('HTTP/1.1 404 Not Found');
    }

「../../../../../../etc/passwd」などの入力が問題になることは頭の中でわかっていますが、他にどのような悪意のある入力を想定し、どのように行うべきか疑問に思っています。それらを防ぐために。

4

9 に答える 9

37

realpath()を使用すると、相対情報を含む可能性のあるパスを絶対パスに変換できます...その後、ダウンロードを許可する特定のサブディレクトリの下にパスがあることを確認できます。

于 2009-12-16T00:11:21.200 に答える
14

ユーザーが提供する可能性のあるすべての安全でないパスを予測しようとするのではなく、basenameを使用してください。

于 2009-12-16T00:06:24.480 に答える
9

OPによる解決策:

$baseDir = "/home/gsmcms/public_html/central/app/webroot/"; 
$path = realpath($baseDir . $_GET['file']); 

// if baseDir isn't at the front 0==strpos, most likely hacking attempt 
if(strpos($path, $baseDir) !== 0) { 
   die('Invalid Path'); 
} elseif(file_exists($path)) { 
   echo file_get_contents($path); 
} else { 
   header('HTTP/1.1 404 Not Found'); 
   echo "The requested file could not be found"; 
} 
于 2014-10-30T21:48:26.350 に答える
6

可能であれば、許可されたファイルの配列のようなホワイトリストを使用し、それに対して入力をチェックします。ユーザーが要求したファイルがそのリストに存在しない場合は、要求を拒否します。

于 2009-12-16T00:14:25.517 に答える
5

ここには、追加の重大なセキュリティ リスクがあります。このスクリプトは、サーバー側の処理なしでファイルのソースを出力ストリームに挿入します。これは、アクセス可能なファイルのすべてのソース コードがインターネットに漏洩することを意味します。

于 2009-12-16T13:31:08.223 に答える
4

realpath を使用している場合でも、使用する前にすべての「..」を削除する必要があります。そうしないと、攻撃者はサーバーのディレクトリ構造全体を力ずくで読み取ることができます。たとえば、「valid_folder/../../test_if_this_folder_name_exists/valid_folder」などです。アプリケーションがこのパスを受け入れると、攻撃者はフォルダーが存在することを認識します。

于 2016-03-08T11:48:33.573 に答える