PHP ダウンロードサイトの直リンク

このQ&Aのポイント
  • PHPを使用してzipのダウンロードページを作成している際に、直接download.phpのリンクを知っている人がいた場合の対策方法について教えてください。
  • 現在、phpを用いてzipのダウンロードページを作成しており、必要事項を入力してもらった上でダウンロードができる仕組みです。しかし、直接download.phpのリンクを知っている人がいた場合、urlに直接入力することでアクセスできてしまいます。この問題を解決するための方法やベストプラクティスについて教えてください。
  • 現在、phpを使用してzipのダウンロードページを作成しています。しかし、直接download.phpのリンクを知っている人がいた場合、urlに直接入力することでアクセスできてしまいます。この問題を解決するための方法やリスクを避けるためのベストプラクティスについて教えてください。
回答を見る
  • ベストアンサー

PHP ダウンロードサイトの直リンク

お世話になります。 技術的な質問といいますか、疑問なのですが、ぜひ皆様のご意見を伺わせてください。 現在、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も正直、どのように書いたらいいのかよくわかりません・・・ もし、他にいい方法がありましたらぜひ教えてください。 よろしくお願い致します。

  • PHP
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • singlecat
  • ベストアンサー率33% (139/418)
回答No.1

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; }   

teckiko
質問者

お礼

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

その他の回答 (1)

  • BellBell
  • ベストアンサー率54% (327/598)
回答No.2

会員制なんですよね? それなら、ログイン処理を入れてログインしていなければダウンロードできないようにしていればいいと思います。 ログインしたページに、ダウンロードできるファイルの一覧って形で表を用意しておいて、クリックするとdownload.phpに。 ログイン無しでdownload.phpを直接入力しても、ログインされていませんと表示すればOKだと思いますが。 $_SESSIONあたりを使って、ログイン情報を引き回せますよ。

teckiko
質問者

お礼

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

teckiko
質問者

補足

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

関連するQ&A

  • PHPでのエラーチェックについて

    PHP 初心者デス。よろしくお願いします。 勉強のため、PHPにてメールフォームを作成してます。 PHPでのエラーチェックについて教えていただきたいのですが、 よろしくお願いします。 メールフォーム自体は下記のような流れで作成しております。 ------------------------------------------- 入力フォーム(index.php) ↓(check.php エラーチェック用ファイルとおる) 確認画面表示(confirm.php) ↓(send.php 送信処理がかかれたファイルとおる) 完了画面表示(thanks.html) ------------------------------------------- エラーチェックはindex.phpで必須項目などが、未入力、空白があれば、 送信ボタンを押した際に、index.php自体の入力フォームの下などに 「未入力です」などのエラー表示をさせたいのですが、うまくいきません。 ご教授お願いいたします。 できればSESSIONなどを使用せず行いたいですが可能でしょうか? とりあえず自力でやって、うまくいかなかったのは以下内容です。 --------------------------------------------------- check.phpにエラーチェック用処理を記載しており、index.phpのフォームには <form method="post" action="check.php"> としてます。 ですが、これだともちろんエラー表示はchek.phpに表示されてしまい、 うまくindex.phpにエラー表示ができません。 またindex.phpに入力した内容をconfirm.phpにPOSTで渡せなかったりします。 index.phpにincludeなどでchek.phpを読み込ませて、 <form method="post" action="confirm.php"> としてみても、 うまくエラーチェックが動作しなかったり、 index.phpに入力した内容をconfirm.phpにPOSTで渡せなかったり、 苦労してます。 どうかご教授のほど、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPでファイルダウンロードの上限

    PHPを使ってファイルをダウンロードするプログラムを書きました。 header()で最後にreadfile()で出力する流れですが、htaccessで 「upload_max_filesize」「post_max_size」「memory_limit」を600Mとしましたが、 PHPでダウンロード出来る容量が約100MB程度しかダウンロード出来ません。 色々と調べましたが原因が分かりません。 お分かりになる方、教えていただけないでしょうか? よろしくお願い致します。

    • ベストアンサー
    • PHP
  • 携帯サイトで [プルダウンリンク] を使いたいのですが・・・m(_ _)m

    携帯用サイトを作成しています。 <a href="○○○/~×××/download01.php?sid=<?=$sid?>">ダウンロード1</a><br> <a href="○○○/~×××/download02.php?sid=<?=$sid?>">ダウンロード2</a><br> <a href="○○○/~×××/download03.php?sid=<?=$sid?>">ダウンロード3</a><br> <a href="○○○/~×××/download04.php?sid=<?=$sid?>">ダウンロード4</a><br> <a href="○○○/~×××/download05.php?sid=<?=$sid?>">ダウンロード5</a><br> etc・・・ というPHPを使用したリンク郡を、プルダウンリンクとして一行にまとめたいのですが、 どう記述すれば良いのか教えて頂けないでしょうか。 ちなみに、このCGIは業者に製作してもらいました。 私自身はCGIのスキルはなく、HTMLを記述出来る程度です。 どうぞ、皆様の知恵をお貸し下さい。宜しくお願いします。m(_ _)m

    • ベストアンサー
    • PHP
  • PHP5で,デッドリンクチェックが可能? 

     マニュアル本を片手にPHP5を使用して,HPを現在作成中なのですが,デッドリンクのチェック行う必要が出てきました。  fopen,fsockopenなどを使用してというところまでは,分かるのですが正直言ってその後の処理が分かりません。 それに,サイトのデッドリンクのチェックではなく,サイトの中にあるファイルの有無(ダイレクトリンク)のチェック,つまり,他のサーバー上にあるファイルに直リンをかけてあり,その直リンが生きているかどうかを判定したいということです。PHP5が理想なのですが,他の言語でもかまいませんので教えていただければと思います。  mysql上にリンクアドレスを1000以上登録してあり,それを呼び出してきて,判定の結果を書き込むということを考えています。mysqlから読み込み,書き込みはできるのですが,デッドリンクのチェックという肝心なところが,見当もつきません。   質問の内容を簡潔にすると (1) PHP5でデッドリンクのチェックが可能かどうか,さらに,それが直リンでも可能か,可能であればその方法をご指導ください。 (2) 他の言語では,可能かどうか,可能であればそのソースをご指導ください。 非常に,困っています。よろしくお願いします

    • 締切済み
    • PHP
  • PHPでの階層構造

    PHP初心者です。 現在、winxp pro sp2でapache2.0.54とPHP4でサイトを作っているのですが、PHPファイルの基本的な階層構造(ファイルの置き方)やこうした方が良いという方法はありませんでしょうか? 例) htdocs(DocumentRoot) ┣proc ┃┗regist_check.php(登録内容の入力チェック用) ┣index.php ┣top.php ┣regist.php ┗.htaccess 今現在、上のような階層になっています。 「http://自分のURL/proc/」 このようにアクセスされる分にはapache側でアクセス出来ないようになっていますが、 「http://自分のURL/proc/regist_check.php」 このようにチェック用のPHP等に直接アクセスされると非常に困るのですが、こういったことを回避するにはどういう方法がよろしいでしょうか? よろしくお願い致します。

    • ベストアンサー
    • PHP
  • ファイルをダウンロードしたい

    PHPでDBから取ってきたデータをエクセルに出力し、ダウンロードさせる プログラムを書いていますが、うまくいきません。 処理の流れは以下のようになっています。 ----------------------------------------------------- ◇top.php(ダウンロードボタン押下) ↓ ◇action.php実行 さらにこの中で、 ・logic.php実行→DBからデータ取得 ・excel.php実行(ダウンロードボタン押下時のみ) logicからデータをもらってエクセルファイル生成。 header("Content-type: application/vnd.ms-excel"); header("Content-Disposition: attachment; filename=\"$filename\""); ・view.php実行→Smartyでtop.phpの画面表示(top.tpl) (logicからviewに値を渡してデータを画面表示) ----------------------------------------------------- この処理だと、ダウンロードされるファイルが生成したものでなく、 top.phpをダウンロードしてしまうんです。(中身はHTMLですけど。) 同じような質問がありましたが、結局どうしたらいいのか・・ http://oshiete1.goo.ne.jp/kotaeru.php3?q=1432459 top.phpにはデータを表示していて、ダウンロードボタンも付いている って感じです。ボタンを押した時の挙動をどうしたらいいのか、いまいち 分かりません。 よろしくお願いします。

    • 締切済み
    • PHP
  • phpのエラーチェックについて質問です!

    phpのエラーチェックについて質問です! エラーチェックについてです><; if(isset($_POST['name'])){ $name = htmlspecialchars($_POST['name']); if (empty($name)) { $message = '未入力があります'; と記入してエラーメッセージを表示したい場所に記載してます。 しかし、フォームで <form action="regist2.php" name="form" method="post"> でsubmit押すとフォームが空白でもactionでregist2.phpに送られてしまいます><; エラーがなければ、そのままsubmitでaction=regist2.phpに送りたいと考えております。 なにか解決方法はないでしょうか? ご教授お願いします!!!!!!!!

    • 締切済み
    • PHP
  • PHPでファイルのダウンロードについて

    お世話になります。ダウンロードボタンを付けてファイルのダウンロードを行う処理で困った事になってます。 (DL.php) $file_name=htmlspecialchars(@$_POST['file_name']); $file_name=addslashes($file_name); mb_convert_variables("SJIS-WIN","EUC-JP",$file_name); $file_to=htmlspecialchars(@$_POST['file_to']); $file_to=addslashes(@$_POST['file_to']); header ("Content-Disposition: attachment; filename=".$file_name); header ("Content-type: application/octet-stream"); require_once("dl_config.php"); readfile ($data_pas.$file_to); dl_config.php <?PHP $data_pas="/data/"; ?> この状態でテキストファイルをダウンロードすると、DLしたファイルの中に不要な改行ファイルが挿入されています。 またrequire_once("dl_config.php");を削除し readfile ($data_pas.$file_to);を readfile ("/data/".$file_to);とすると、改行は入らなくて、正常なファイルがダウンロードされます。 よろしくお願いします。

    • 締切済み
    • PHP
  • PEAR拡張モジュールのダウンロード

    PHPで入力した情報を別のページに POSTするページを作成しています。 PEARのHTTP_Requestを使いたいのですが、 ダウンロード方法がわかりません。 http://pear.php.net/ ここからダウンロードできるという記事を見つけたので 早速バージョン1.4.4をダウンロードしました。 アーカイブを解凍すると中身はpackage.xmlになっていたのですが、 欲しいファイルはRequest.phpというようにphpファイルです。 Request.phpがダウンロードできると思っていたのですが、 package.xmlをどのように使用すればいいのかわかりません。 ダウンロードする場所は、 http://pear.php.net/package/HTTP_Request/download/ ここではないのでしょうか? 初心者過ぎて大変申し訳ないのですが、 どうかお助けください。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • .htaccessによる制御 phpとssi

    某ポータルサイトを運営しておりまして サイトはxhtmlで作っています。(拡張子はhtml) そこではssiを使用していて、一番トップのディレクトリ(index.htmlがあるところ)には .htaccess ------------------------------------------------------------------------------------- Options +Includes AddType text/html html .shtml .html .htm .xhtml AddHandler server-parsed html .shtml .html .htm .xhtml ------------------------------------------------------------------------------------- を設置しております。 これで問題なくhtmlの拡張子で表示しております。 次に 新しくサイトリニューアルしようとphpを使いサイトを作っていまして、 そのページ(xhtmlで作って拡張子はhtml)が入ったフォルダをアップしまして トップより下の階層(そのリニューアルページが入ったフォルダ)に.htaccessを ------------------------------------------------------------------------------------- AddType application/x-httpd-php .php .html .xhtml .shtml ------------------------------------------------------------------------------------- と書いたものをあげました。 ところがページを見るとダウンロードになってしまい、ページを読み込むことができません。 .htaccessを削除するとページは表示されますが、phpが有効になっていません。 試しにトップの階層の ssiを有効にする.htaccessを消して phpを有効にする.htaccessだけ残すと 問題なく表示されます。 上の階層のssiを有効にする.htaccessがある限りページはダウンロードになってしまいます。 .htaccessは下の階層ほど優先されるはずが、 「優先」というだけで「上の階層のは読まない」わけではないんですよね? おそらく問題は トップの階層にある、ssiを有効にする.htaccessだと思いますが なんとか旧ページのssiを有効にしつつ、新ページのphpを有効にする両方有効にする手段はないのでしょうか? 疑問(1)phpとssiは同時に動かない? 疑問(2).htaccessで下の階層だけ読んで上の階層の.htaccessは読ませない設定はあります? 疑問(3)下の階層の.htaccess(phpを有効にするhtaccess)の方で上のssiの設定を打ち消す書き方はあります? 参考までに階層はこうなっています index.html hoge.html .htaccess(ssiを有効にする設定) new ├.htaccess(phpを有効にする設定) ├salon1 |  ├index.html(問題のページ1) |  ├imgフォルダ |     ├aaa.jpg ├salon2 |  ├index.html(問題のページ2) |  ├imgフォルダ |     ├aaa.jpg ・ ・ ・ ちなみに問題のページのディレクトリに直接htaccessを置いてもダメでした。 お願いします

    • ベストアンサー
    • PHP

専門家に質問してみよう