ファイルへの直接アクセスを禁止するには?

2013年10月15日 at 23:53

お世話になります。(バージョン:5.6.1.2)

ファイルマネージャーからアップロードしたファイルのアクセス権限を編集して、
特定の会員やグループからしかアクセスできないようにしたいのですが、
デフォルトでは、実体の保存先である /file フォルダが公開ディレクトり内にあるので、

 http://www.abc.com/files/0123/4567/8910/image.jpg

などと直接アクセスすると、権限設定に関係なく丸見えになってしまいます。

それなら、/file フォルダを非公開ディレクトりへ移動させようと、
base.php の "/files" という部分を書き換えてみましたが、

 /concrete/config/base.php

それだけでは正常にアクセスできなくなってしまいました。

ちなみに、ファイルのダウンロードは、常に PHP のスクリプトを経由して行われているのでしょうか?
直接アクセスを廃し、常に認証を強要したいのですが。

何卒ご教示のほど、よろしくお願い致します。

タグ:

Re: ファイルへの直接アクセスを禁止するには?

2013年10月15日 at 23:59
こんにちは。
concrete5の /files 以下のディレクトリは暗号化によって作成されたフォルダ名ですし、ひとつのフォルダに1つのファイルしか入りませんので、仮にそのディレクトリの中身がバレても他のファイルがバレることにはなりません。
また、権限設定すればファイルのURLはPHPを経由するので、オリジナルの保存位置は隠蔽されますので、外部にはバレません。
そのため、そのまま使っていただいても、誰かが故意にURLを流出させるという場合を除けば問題ないのですが…一応、非公開ディレクトリにファイルを移す方法はあります。非公開ディレクトリを追加のファイル保存場所に設定し、ファイルをそちらに移動することができます。
説明はメンドクサイので過去に書いたブログをご参照ください wink
http://notnil-creative.com/blog/archives/2149
 

Re: Re: ファイルへの直接アクセスを禁止するには?

2013年10月16日 at 5:12
お返事ありがとうございます。
権限設定すればファイルのURLはPHPを経由するので、

上級権限モードではありますが、ファイルマネージャで閲覧できるユーザからゲストを外し、管理者しか閲覧できないようにしてみても、依然として直リンクへリダイレクトされてしまいます。何故なのでしょうか?

 http://www.abc.com/download_file/0/123/
  ↓
 http://www.abc.com/files/0123/4567/8910/image.jpg

非公開ディレクトリを追加のファイル保存場所に設定し、ファイルをそちらに移動することができます。

なるほど、「ファイルの保存場所」の「標準のファイル保存場所」の部分で、アップロード先が決まっていたのですね。了解しました。
 

Re: ファイルへの直接アクセスを禁止するには?

2013年10月16日 at 10:08
ああ、確認したらファイル保存場所がデフォルトのときはダウンロードの強制ではなくリダイレクトになるようになってました。なんでだろ…

とりあえず、下記コードでオーバーライドすると元ファイルURLは見えなくなります。

/controllers/download_file.php に設置

<?php

defined('C5_EXECUTE') or die("Access Denied.");
class DownloadFileController extends Concrete5_Controller_DownloadFile {

protected function download($file, $rcID=NULL) {
$filename = $file->getFilename();
$file->trackDownload($rcID);
$ci = Loader::helper('file');
$ci->forceDownload($file->getPath());
}

}
 

Re: Re: ファイルへの直接アクセスを禁止するには?

2013年10月16日 at 18:20
お話の通り、「download_file.php」のオーバーライドで解決しました。

ただ、「標準のファイル保存場所」の変更は、キャッシュなどは素直に移動してくれるのですが、ファイルマネージャからアクセスできなくなったり、少し変な挙動を示しました。
なので変更するのはやめて、.htaccess で直接アクセスを拒否してみました。
 ----- .htaccess -----
 Deny from all
 --------------------

これで安心です。ありがとうございました。