0

ユーザーがあらゆる種類のファイルをアップロードできる Web サイトを作成しています。すべてのファイルは「files/」フォルダーに保存されます。ユーザーがそのフォルダー内のファイルを表示およびダウンロードできるようにしたいが、実行はできないようにしたい。

JPG ファイルなどの一部のファイルは簡単です。ブラウザには、それらを表示するシステムが組み込まれていることは周知のとおりです。

PDF ファイルなどの他のファイルは直接表示できないため、ブラウザーが行うことは、ユーザーにダウンロード画面を表示することです。それもいい。

ただし、PHP ファイルなどの他のファイルには問題があります。そのようなファイルを開くと、注意しないと実行されてしまいます。たとえば、ファイルに

<?php echo 'ok'; ?>

次に、「files/myphpfile.php」に移動すると、ファイルの内容ではなく、「OK」と表示されます。これは、PHP ファイルだけでなく、サーバーが実行できる他のファイル タイプ (たとえば、ASP ファイルなど) でも発生すると思います。

私が必要としているのは、ユーザーがファイルを実行できないようにすることです。これにより、ユーザーが「files/myphpfile.php」に移動すると、ファイルの内容が表示されるか、ブラウザーがダウンロード画面を表示するようになります。理想的には、サーバーによって実行可能なすべてのファイル タイプのリストを作成する必要がない、一般的なソリューションです。

私にとって最も合理的なアプローチは、ファイルのパーミッションを 644 に設定して、ユーザーがファイルの読み取りのみを行えるようにすることでした。しかし、その後、PHP ファイルは実行され続けます。

4

2 に答える 2

2

ダウンロードする:

header('Content-Type: text/plain');
header('Content-Disposition: attachment; filename=somefile.php');
header('Pragma: no-cache');
readfile('/path/to/somefile.php');

表示する:

echo htmlspecialchars(file_get_contents('/path/to/somefile.php'));

アップデート

そのようなファイルを開くと、注意しないと実行されます

そのため、ファイルへの直接リンクはありません。つまり、ファイルはドキュメント ルート内のどこかにアップロードされるべきではありません。ファイルがドキュメント ルート以外のディレクトリにアップロードされている場合、ユーザーは URL で直接アクセスすることはできません (例: http://example.com/files/somefile.php.

これは、PHP ファイルだけでなく、サーバーが実行できる他のファイル タイプ (たとえば、ASP ファイルなど) でも発生すると思います。

どのファイルが危険であるかを判断できるのは、あなただけです。asp ファイルを提供 (および解析) するサーバーがあるかどうか、また、そこに潜在的に危険なファイルが他にあるかどうかはわかりません。

私が必要としているのは、ユーザーがファイルを実行できないようにすることです。これにより、ユーザーが「files/myphpfile.php」に移動したときに、ファイルの内容が表示されるか、ブラウザーがダウンロード画面を表示するようになります。

上記の既に提供されているソリューションを参照してください。

私にとって最も合理的なアプローチは、ファイルのパーミッションを 644 に設定して、ユーザーがファイルの読み取りのみを行えるようにすることでした。しかし、その後、PHP ファイルは実行され続けます。

これは、PHP ファイルが実行されていないためです。それらは解析されているだけです(つまり、Webサーバーによって読み取られています)。

したがって、基本的に、危険な可能性のあるファイルの種類を見つける必要があります (たとえば、PHP によって解析される可能性のある他のファイルについても考えて.phtmlください)。いずれにせよ、ユーザーは HTTP リクエストを介して実行可能ファイルを呼び出すことはできません。サーバー上で実行されることhttp://example.com/run-virus.exeはなく、ファイルを要求するだけだからです。

于 2012-10-05T23:00:53.813 に答える
0

実際の場所から直接ではなく、スクリプトを介してファイルを表示することで問題を解決しました。このスクリプトは、私の以前の質問に対する回答から取られました。

$fileinfo = finfo_open( FILEINFO_MIME_TYPE );

header( 'Content-Type: ' . finfo_file( $fileinfo, 'files/' . $filename ) );

finfo_close( $fileinfo );

readfile( 'files/' . $filename );

したがって、'files/myfile.php' を見たいユーザーは 'open/myfile.php' に移動する必要があります。上記のスクリプトはダウンロード画面を表示するか、ブラウザでファイルを表示できる場合はブラウザにファイルを表示します。そうする。

于 2012-10-06T01:26:15.557 に答える