PHPのフォルダとファイルのアクセス許可

私は、フォルダとファイルのアクセス許可の仕組みに関するいくつかの質問をしています。私は以下のように '保護された'外のユーザーディレクトリを持っていると言う。

users
  -- usera
    -- docs
  -- userb
    -- docs
protected

私は、権利を持っていないユーザーBが、ユーザーAディレクトリー内の何にでもアクセスすることを望んでいません。また、私は誰もURLリンク経由でディレクトリディレクトリにアクセスすることを望んでいません。基本的には、ユーザーが自分のディレクトリにアクセスできるようにし、他には誰もアクセスできないようにします。どのようにそれを行うことができますか?

ありがとう!

0
これはより多くの文脈を必要とする。アクセス方法は? " protected "の関連性は何ですか?
追加された 著者 deceze,
これは、通常はファイルシステムのことである「アクセス許可」について話しているので、やや混乱します。あなたは、Webサーバーを通じてファイルにアクセスする際に、より抽象的なアクセス許可について話しているようですか、それともあなたですか?
追加された 著者 deceze,
ファイルを読み込んだりダウンロードしたりするときのようにアクセスする。 protectedは、phpスクリプトをホスティングするための.htaccess 'deny from all'ディレクトリです。
追加された 著者 twb,
混乱させて申し訳ありません。私は認証のように許可を参照しています。認証されたユーザーは自分のファイルとフォルダにしかアクセスできません。同様に、どのWebユーザーもURLを使用してユーザーのファイルやフォルダにアクセスできないはずです。
追加された 著者 twb,

2 答え

私は疑問に答えました。ユーザをサブディレクトリに制限するあなたのニーズに合わせて調整してください、私はここでもそれをコピーしました。

Download.php

<?php
/** Load your user assumed $user **/

$file = trim($_GET['file']);

/** Sanitize file name here **/

if (true === file_exists('/users/user'.$user->id.'/'.$file)) {
   //from http://php.net/manual/en/function.readfile.php
   header('Content-Description: File Transfer');
   header('Content-Type: application/octet-stream');
   header('Content-Disposition: attachment; filename="'.$file.'"');
   header('Content-Transfer-Encoding: binary');
   header('Expires: 0');
   header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
   header('Pragma: public');
   header('Content-Length: ' . filesize($file));
   ob_clean();
   flush();
   readfile($file);
   exit;
} else {
   throw new Exception('File Not Found');
}

.htaccessすべての直接ファイルのダウンロードを拒否する

deny from all

/download.php?file=filename.extを使用してフォルダにリンクすると、現在のユーザーのusersディレクトリからのみそのファイルがダウンロードされます。

入力ファイル名を確実に浄化して、ディレクトリ横断的な脆弱性がないようにする必要があります。

1
追加された
こんにちは、これはサーバーに余分な負担をかけるでしょうか? 100人のユーザーが一度に異なる1MBのファイル(100×100MB)をダウンロードすると、メモリや処理能力が低下するでしょうか?
追加された 著者 twb,
yup..i私はxsendfileと一緒にこのアプローチを使用すると思います。乾杯
追加された 著者 twb,

私の提案は、ユーザーディレクトリがWebルートの上にあることを確認することです。これにより、それらがリンクされなくなります。次に、ユーザーが誰であるかを検証するPHPスクリプトを作成します。ログインしているユーザーの身元を知ったら、fpassthru()を使うことができます( http://php.net/fpassthru)または同様のものを使用して、ドキュメントをユーザーに配信します。

1
追加された
こんにちは、他にどんな情報が必要ですか?パススルーを使うとサーバーに多くの処理負担がかかると思うので、他の方法がありますか?
追加された 著者 twb,
mod-auth-tokenはうまく見えます!私は共有ホスティングでこれを得ることができないのですか?
追加された 著者 twb,
スピードとサーバーリソースの使用に関するfpassthru PHPページに興味深いコメントがいくつかあります。 freadの使用は、おそらく実際にはより高速です。そのページのコメントをスキャンして、良いヒントを得てください。 PHP関数を使いたくない場合は、mod-auth-token code.google.com/p/mod-auth-token
追加された 著者 Daniel,
共有ホスティングでは、おそらくfreadまたはfpassthruになるでしょう。ランダムなトークンを自分で生成してから、ユーザーのディレクトリにあるhtaccessファイルに書き込んで、そのトークンがファイルにアクセスできるようにすることができます可能です。しかし、それはフリーダよりもあまり有益ではないという面倒な点が多いようです。チャールズの charlesproxy.com を使用して負荷テストを設定することを検討することもできます。 Fiddlerの fiddler2.com では、拡張機能を使用することもできます。
追加された 著者 Daniel,
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com