2017-01-14 8 views
2

ファイルを保存するフォルダがあります。これらのファイルには、Webページからアクセスできます。ディレクトリがmanual/fileName.pdfのようなものだとしましょう。直接アクセスからファイルを保護する

また、manual/フォルダに保存されているファイルの一覧を表示するページがあり、このページはユーザーセッションを使用して保護されています。したがって、ページにアクセスする前にまずログインする必要があります。

.htaccessをフォルダに挿入すると、ユーザーがファイルに直接アクセスするのを防ぐことができます。しかし、今ではそのリスティングページからでもアクセスできません。ここで私は.htaccessに書かれたものは

RewriteEngine on 
RewriteRule .documentation.php 

そしてここでは、スクリプトをリスト私のファイルです:

if ($handle = opendir('manual')) { 
    while (false !== ($entry = readdir($handle))) { 
    if ($entry != "." && $entry != "..") { 
     if (!preg_match('/.php/', $entry) && !preg_match('/.htaccess/', $entry)) //prevent some file to be shown 
      {echo "<a href='manual/$entry' target='_blank'>$entry</a><hr>";} 
     } 
    } 
    closedir($handle); 
} 

ファイルにアクセスする方法任意のアイデア?

+0

htaccessを削除するとphpの一覧が表示されますか?私はそうは思わない。 – sepehr

+0

はい。なぜあなたはそれをどう思いましたか? –

+0

ウェブサーバが500の内部エラーを投げたとしても、 'opendir'はディレクトリを開きます。エラーログを確認しましたか? – sepehr

答えて

2

一般に、ドキュメントルート内から保護されたファイルを提供することは好ましくありません。特に、ユーザーがログインしてアクセスする必要があるとき。サービスをWebサーバーに委任すると、ユーザーがログインしているかどうかをプログラムで確認する能力が失われます。これは、Apache WebサーバーがユーザーがPHPアプリケーション内で認証されているかどうかを知る手段がないためです。ユーザーがファイルURLを知ると、システムにログインせずにファイルにアクセスできます。

解決方法があります。しかし、Webルートの外部にファイルを置いて、アクセスしたときにファイルを配布するスクリプトを開発することを強くお勧めします。この方法で、ファイルを処理するときに、認証された、認可されたセッションを確認できます。

ただし、この方法をお勧めする場合は、回避策があります。のは、サンプルのディレクトリ構造をレイアウトしてみましょう:

/path/to/web/document/root 
├── manual 
│   └── .htaccess 
│   └── file1.pdf # protected 
│   └── file2.pdf # protected 
│   └── file3.epub # protected 
├── documentation.php 
├── listing.php # protected 
└── .htaccess 

ユーザーがログインしているときは、manual/ディレクトリ内のファイルを保護したいとアクセスのみ。だから、あなたはあなたのmanual/.htaccessファイルに以下のディレクティブを置く:

RewriteEngine on 
RewriteRule^/documentation.php [R] 
# Your own rewrite rule has a syntax error and 
# causes a 500 internal error 

はこの親ディレクトリ内のファイルdocumentation.phpすべての要求をリダイレクトします。外部リダイレクトが必要ない場合は、Rフラグを削除してください。

あなたが言ったように、今問題はmanual/の中のファイルへのリクエストがドキュメントファイルにリダイレクトされてしまうことです。

回避策は、ヘッダーを確認し、要求がlisting.phpファイルからのものであることを確認することです。

RewriteEngine on 

# Feel free to change example.com with your own domain  
RewriteCond %{HTTP_REFERER} !^http://www.example.com/listing.php$ 
RewriteRule^/documentation.php [R] 

manual/file2.pdfへの直接の要求はdocumentation.phpへのリダイレクトになりますが、ユーザがlisting.phpのリンクをクリックすると、彼女は問題なくファイルにアクセスすることができますこの方法。

あなたはリファラ条件は、より汎用的にする必要がある場合は、こちらの記事を参照してください。
Referrer Checking with .htaccess

that a user can easily spoof the HTTP_REFERER headerを警告し、したがって、ログインが必要なく、ファイルにアクセスすること。これを実装する唯一の本当の弾丸ではない方法は、私がこの記事の冒頭で言ったことです。

manual/ディレクトリは、基本的なhttp認証を使用して保護することもできます。しかし、この方法では、ユーザはそのフォルダにアクセスするために別のユーザ名/パスワードの組み合わせを入力する必要があります。

+0

それからルートの外に置く場合、私はファイルにアクセスすることができますか? –

+1

PHPはドキュメントルートの外部にあるファイルにアクセスできます。アイデアを得るには、[PHPで大きなファイルを提供する方法](http://teddy.fr/2007/11/28/how-serve-big-files-through-php/)を参照してください。その他の回避策もあります:[ダウンロード可能なファイルを保護するためのベストプラクティス-php/mysql Apache2 server](https://stackoverflow.com/a/5377241/65732)と[PHP/Apacheで大量の保護されたファイルを扱う](https ://stackoverflow.com/a/3232547/65732)。 – sepehr

関連する問題