web-dev-qa-db-ja.com

特定のフォルダ内のファイルへのアクセスを制限する

可能な重複:
ユーザーがログインしていない場合にアップロードを保護する方法

特定のフォルダ内のファイルへの直接アクセスを、その特定の機能が設定されている特定のWordPressユーザーだけに制限する方法はありますか。

2

最も簡単なphpの解決策はダウンロードスクリプトを作ることでしょう。ユーザーが適切な権限を持っているかどうかを確認し、ファイルをWebクライアントに提供します。または私の好みではあなたのWebルートの外にフォルダを設定してそこにファイルを置いてください。

匿名アクセスなしでファイルのアクセス権を設定し、Webサーバーにそれらを読み取らせ、このようにphpファイルに出力させます。以下のコードはファイルを読み込み、それをブラウザに送信します。

header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: private",false); 
header('Content-disposition: attachment; filename='. $file;
header("Content-Transfer-Encoding:  binary"); 
header("Content-Length: ". filesize(ABSPATH.$dir.$file); 
readfile($dir.$file);
exit();

編集14-1:

通常のアップロードボックスを作成し、ファイルがアップロードされたら、Webルートディレクトリ以外のフォルダに移動します(このフォルダには、httpからはアクセスできません。Webサーバのみ)。

if (move_uploaded_file( $_FILES['Filedata']['tmp_name'] , $upload_dir.$filename ) ) {
// code to do after the file has been copied succesfully. Update your database or something.
}

$ upload_dir。$ filenameは、wwwフォルダの外側のディレクトリへのフルパスです。このファイルにはWebサーバーからのみアクセスできます。アップローダ情報を使用してデータベースに場所を保存します。または各ユーザーのサブディレクトリを作成します。ユーザーごとにファイルを区別するためのものが必要です。

ファイルをダウンロードしたいときは、download.phpという名前のスクリプトを作成します。そのスクリプトで、ユーザーにそのファイルに対する権限があるかどうかを確認します。

global $user;
if ($user->id == $uploaded_user_id) {
    header("Expires: 0"); 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
    header("Cache-Control: private",false); 
    header('Content-disposition: attachment; filename='. $file;
    header("Content-Transfer-Encoding:  binary"); 
    header("Content-Length: ". filesize(ABSPATH.$upload_dir.$file); 
    readfile($upload_dir.$file);
    exit();

}

今度はダウンロードスクリプトにfile_idか名前を渡したいと思う。だからurl/download.php?file = $ fileのようなリンクを作ります。直接またはプラグインの初期段階でこれを呼び出す必要があります。そうしないと、ヘッダーにメッセージが既に送信されていることになります。スクリプトは、ユーザーに権限があるかどうかを確認し、バイナリデータの出力を開始します。

それはこのようなものになるはずです、それが役立つことを願っています。それは完全ではありませんが、始めましょう。

3
Patriek