1

非メンバーからフォルダーを保護する .htaccess Apache メソッドを認識していますが、PHP のみでどのように行うことができるのか疑問に思っています。

セッション変数をチェックすることで php ページを保護できますが、写真や PDF への直接アクセスは見過ごされがちです。たとえば、Facebook から写真への直接リンクをコピーしてログアウトし、ブラウザで写真の URL に移動しても問題はありません。

Rapidshare のようなサイトをコンテンツへの直接アクセスから保護するにはどうすればよいですか?

Apache で変数を設定する方法があることは知っています。Apache でセッション変数を確認する方法はありますか?

4

2 に答える 2

5

質問とコメントから、直接アクセスのように見える URL を求めているようですが、それらをダウンロードするための認証を可能にするために PHP スクリプトを通過します。あなたの現在のディレクトリ構造がわからないので、この回答のテストケース用に作成します-小さなリストではありますが:

public-html/
    content/        <- where the actual files are
        .htaccess   <- to deny access to the directory
    .htaccess       <- the one created here
    download.php    <- download script

このことから、すべてのファイルが に/contentあり、「直接リンク」が次のように見えると仮定します。/file

/content/.htaccess:_

deny from all

次のものは、最初のRewriteRuleものは既に存在する通常のファイルが上書きされないようにするためのものであり、前の.htaccessものはそのディレクトリ内のファイルへのアクセスを防ぐためのものであることに注意してください。既に使用している がある場合.htaccess、重要なルールは最後のルールであり、一致すると処理が停止するため、既存の に適宜配置します.htaccess

/.htaccess:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} -s [OR]
    RewriteCond %{REQUEST_FILENAME} -l [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^.*$ - [NC,L]

    RewriteRule ^file/(.+)$ download.php?file=$1 [L]
</IfModule>

それが整っていると、 に行くとファイルへの直接アクセスのように見え、のよう/file/myDocument.pdfにスクリプトに送信されますdownload.php?file=myDocument.pdf

そこから、使用するダウンロード スクリプトを作成するだけです。私が投稿しているのは、Armand Niculescu の修正版です ここ. 関連する部分のみをここに投稿します (全体は PasteBin で見つけることができ、ここに投稿された部分をニーズに合わせて変更できます)。

/******************************
 * PERFORM AUTHORIZATION HERE *
 *   The following is added   *
 ******************************/
if($_SESSION['validated'] !== true) {
    //Not authorized to download, send header and exit
    header("HTTP/1.0 401 Unauthorized");
    exit;
}

また、正しいファイル パスを 8 行下に少し編集しました。

$file_path  = './content/' . $file_name;

以上で、動作するダウンロード スクリプトを取得し、ファイルに直接アクセスできるように見せる方法の小さな例を終わります。

于 2013-04-14T23:24:09.500 に答える
2

あなたの質問から、フォルダーを直接アクセスから保護する方法と、php スクリプトを保護する方法を既に知っていることがわかりました。したがって、必要なのは、ファイルへの間接アクセスを提供する保護された php スクリプトです (コメントで既に述べたように)。

このダウンロード スクリプトを作成するときは、いくつかの重要な詳細を覚えておく必要があります。

  • MIME タイプを提供します。多くの場合header("Content-Type: application/octet-stream")、それで十分ですが、
  • ファイルを (表示する代わりに) ダウンロードするようにクライアントに指示し、ファイル名を指定します。header('Content-Disposition: attachment; filename="' . basename($path) . '"')
  • ファイル サイズを指定します。header("Content-Length: " . filesize($path));
  • 大きなファイルでの問題を回避するには、 の代わりに次のようなものを使用する必要がありますreadfile

    $file = fopen($path, 'r');
    flush(); 
      while (!feof($file)) { 
      print(fread($file, 4096)); 
      flush(); 
    }
    fclose($file);
    
于 2013-04-14T23:27:23.373 に答える