電子書籍の厳選無料作品が豊富!

お世話になります。

技術的な質問といいますか、疑問なのですが、ぜひ皆様のご意見を伺わせてください。

現在、phpを用いてzipのダウンロードページを作成しております。
本サイトは簡単な会員制のため、必要事項を入力してもらった上でダウンロードができる仕組みです。

まず、ファイル構成は、
1、top.html
2、check.php
3、download.php
となっております。

topにはformで、入力した内容をcheck.phpに渡す処理が書かれております。
check.phpには、入力された内容を確認し、場合によってはhtml画面に戻ったりします。
download.phpは、aタグでダウンロードリンクが書かれており、クリックをすると保存ダイアログが開きます。

この一連の流れはすでに完成しているのですが、問題となっているのが直接download.phpのリンクを知っている人がいたとして、urlに直書きしてしまうとアクセスできてしまうということです。

なので、.htaccessを使って制限する方法か、またはdownload.phpで渡ってきた$_POSTの中身が空白ならばエラー処理 というような流れを作ったほうがいいのでしょうか。

※ちなみに$_POSTで渡ってくるものは全て何かしら入力されており空白は許していません。


.htaccessも正直、どのように書いたらいいのかよくわかりません・・・

もし、他にいい方法がありましたらぜひ教えてください。
よろしくお願い致します。

A 回答 (2件)

download.phpを下記のようにすれば良いと思います。



1.ダウンロードさせる対象のファイルを公開以外のローカルフォルダーに格納
  →これにより直ダウンロードはできません。
2.このプログラムの中から、ダウンロードさせる対象のファイルを読み込み標準出力にはき出す。
  ※下記にPDFをダウンロード(inlineで)させる例です。

//$filename には、ローカルファイルフルパス名が入っている(PDF)

if( !file_exists($filename) ) {
return false;
}
$filesize = filesize($filename);

header("Content-Disposition: inline; filename=".basename($filename));
header("Content-Length: " . $filesize);
header("Content-Type: application/pdf");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0,pre-check=0");
header("Pragma: private");

$handle = fopen($filename, "rb");
while (!feof($handle)) {
echo fread($handle, 4096); // TimeOutさせない為
flush();          // TimeOutさせない為
}
fclose($handle);
return true;
}
  
    • good
    • 0
この回答へのお礼

なるほど~
こういう技もあるのですね、勉強になります!
すみません、まだサイトへの実装作業に取り掛かれていないので、後日実装してみます~
ありがとうございました!

お礼日時:2012/06/07 14:53

会員制なんですよね?


それなら、ログイン処理を入れてログインしていなければダウンロードできないようにしていればいいと思います。
ログインしたページに、ダウンロードできるファイルの一覧って形で表を用意しておいて、クリックするとdownload.phpに。

ログイン無しでdownload.phpを直接入力しても、ログインされていませんと表示すればOKだと思いますが。

$_SESSIONあたりを使って、ログイン情報を引き回せますよ。

この回答への補足

すみません、会員制というのが少しオーバーな表現でした。
会員といいますか、フォームに氏名やメールアドレスを入力して頂く→結果的に会員になる という流れなので、会員と申し上げましたが、実際はログイン画面を別途用意しているわけではないのです。
説明が足らず申し訳ありません。

しかし、$_SESSIONは、何か別の方法で使えそうな気がします!

補足日時:2012/06/07 14:55
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2012/07/05 10:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!