0

私のphpファイルでは、次のように$_GETパラメータを使用してサーバー上のファイルを開きます。

$filename = $_GET["filename"];
$content = file_get_contents("/path_to_files/".$filename);

私の質問は、ユーザーがサーバー上の親フォルダー内のファイルにアクセスできないように、これをより安全にするにはどうすればよいですか? これは、アクセス許可や構成など、サーバー上で行う必要があることですか? または$filename、私のphpファイルで検証する必要がありますか? 前もって感謝します!

4

5 に答える 5

5

最も安全な方法は、ファイル パスを使用する際に外部パラメーターを使用しないことです。次のようなものを実装できます。

$files = array (
    'file1' => 'path/to/file1.php',
    'file2' => 'path/to/file2.php',
    'file3' => 'path/to/file3.php',
    ...
);

if ( in_array($_GET['file'], array_keys($files) ) )
{

    $content = file_get_contents($files[$GET['file']]);
}

それ以外の場合...ここからアプローチを確認してください: ファイル名の文字列サニタイザー

于 2013-09-18T06:40:59.237 に答える
1

許可されたファイルの「ホワイトリスト」を用意することをお勧めします。

ファイル名のパターン [someName] [dot] [extension] のようなものを使用できます

if (!preg_match('/^[a-zA-Z0-9_-]+\.[a-zA-Z0-9]+$/', $filename) {
   throw new Exception('file not allowed');
}

ただし、この方法では、ユーザーは/path_to_files/ ディレクトリ内のすべてのファイルにアクセスできます

于 2013-09-18T06:42:07.320 に答える
1

ユーザーではなく実際にファイルにアクセスするのはphpであるため、サーバーのアクセス許可について何かをする必要はないと思います。

ファイルのホワイト リストに対して $filename を確認できます。あなたがやろうとしていることについてもっと情報を提供できますか?

于 2013-09-18T06:39:47.070 に答える
0

ホワイトリストが最も安全な方法のようですが、次のようなスクリプトを使用できます

$file = realpath("/path_to_files/" . $_GET['filename']);
// Check that $file is actually in the specified path
if(substr($file, 0, strlen("/path_to_files/")) == "/path_to_files/"){
    include($file);
}

しかし、リアルパスをだますことができるかどうかはわかりません...

于 2013-09-18T10:57:46.290 に答える