4

セキュリティ上の理由から、public_html フォルダーの外にファイルを保存しています。ただし、ユーザーがこれらのファイルのいずれかをダウンロードできる特定のファイルにリンクしたいと思います。

サーバー PATH をアップロード フォルダーとして指定できる jquery スクリプトを使用していますが、public_html フォルダーの外にアップロードします。

唯一の問題は、ファイルのダウンロードに使用される「アップロード パス」への URL を指定する必要があることです。私は次のようなことができるかもしれないと思った:

public_html/redirect (contains htaccess which forwards all requests to "hiding" folder)

hiding (outside public_html)

A user clicks /redirect/file.doc and they download a file located at hiding/file.doc

これは可能ですか?そうでない場合、public_html ディレクトリ外のファイルへの特定のファイル ダウンロード アクセスを許可するにはどうすればよいですか? 私は以前に他のスクリプトでそれを見たことがあることを知っています...

4

3 に答える 3

10

これは、「php ダウンロード ハンドラ」で実行できます。

このようなメソッドを使用して、ファイルの内容とファイル情報ヘッダーをユーザーのブラウザーに返すことができますが、この前に他に何も出力されていないことを確認してください。

これを別のファイルに入れて、たとえばdownload.php.

function returnFile( $filename ) {
    // Check if file exists, if it is not here return false:
    if ( !file_exists( $filename )) return false;
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    // Suggest better filename for browser to use when saving file:
    header('Content-Disposition: attachment; filename='.basename($filename));
    header('Content-Transfer-Encoding: binary');
    // Caching headers:
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    // This should be set:
    header('Content-Length: ' . filesize($filename));
    // Clean output buffer without sending it, alternatively you can do ob_end_clean(); to also turn off buffering.
    ob_clean();
    // And flush buffers, don't know actually why but php manual seems recommending it:
    flush();
    // Read file and output it's contents:
    readfile( $filename );
    // You need to exit after that or at least make sure that anything other is not echoed out:
    exit;
}

基本的な使用のためにそれを拡張します:

// Added to download.php
if (isset($_GET['file'])) {
    $filename = '/home/username/public_files/'.$_GET['file'];
    returnFile( $filename );
}

警告:

$_GETこれは基本的な例であり、ユーザーが適切にサニタイズされていない悪意のある利点を利用しようとする可能性があることを考慮していません。

これは基本的に、passwd特定の条件が適用される場合、ユーザーがファイルやその他の機密情報を取得できることを意味します。

たとえば、次のように取得し/etc/passwdます。

ブラウザをポイントするだけでhttp://server.com/download.php?file=../../../etc/passwd、サーバーはそのファイルを返します。したがって、実際に使用する前に、ユーザーが提供する引数を適切にチェックしてサニタイズする方法を見つける必要があります。

于 2012-04-22T23:23:05.847 に答える
1

の外側のパスを使用することはできませんpublic_html

mod_rewriteリクエストを書き換えるだけですが、パスは引き続きユーザーが利用できるはずです。

于 2012-04-22T23:15:04.497 に答える
0

これを行うもう 1 つの標準的な方法は、mod_xsendfileを使用することです。これにより、Web アプリケーションは、ヘッダー (X-SendFile) でパスを指定することにより、Web サーバーに出力としてファイルを送信させることができます。

于 2012-04-22T23:37:15.050 に答える