いよいよ公開!ア・ゴースト・ストーリーのみどころ紹介!

お世話になります。

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

現在、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も正直、どのように書いたらいいのかよくわかりません・・・

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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QボタンをクリックでPHP文を実行

ボタンをクリックしたときのみPHP文を実行したいのですが・・・

<input type="button" onClink="<?php~?>">
でいけるかと思ったのですが、
ページ表示時に<?php~?>が実行されてしまい、うまくいきませんでした。

onClink="window.open(test.php)"
という方法以外でお願いします。

Aベストアンサー

AjaxはもともとJavaScriptの機能である非同期通信をつかったもので。Ajaxという言語があるわけではありません

Ajaxを利用するのであれば、JavaScriptのXMLHttpRequestを使って非同期通信できるような実装をしなくてはなりません
簡単にサンプルコードで書けるほど単純なものでもありません

一般的なサーバーサイドスクリプトの動作として、
ボタンを押す->サーバーへリクエストする->サーバーが処理する->クライアントに何かしらの結果を返す(出力する)です
つまり、PHP等のサーバーサイドスクリプトは、遷移させることが大前提で動作します

ですから、ボタンを押してその場でJavaScriptと同じようにPHPが動くなんてことはありえません。
ボタンを押したらサーバーにリクエストする という動作ならば可能です。

つまり
質問で言われているような
onClink="window.open(test.php)"

<form name="f1" action="test.php" method="post">
<input type="submit" name="submit" value="submit" />
</form>
等のような形になります

こういった一般的な方法だと いちいち画面が切り替わったようになってしまうのを嫌って Ajaxでコレと同じことを、画面を切り替えずに行っているだけに過ぎません

AjaxはもともとJavaScriptの機能である非同期通信をつかったもので。Ajaxという言語があるわけではありません

Ajaxを利用するのであれば、JavaScriptのXMLHttpRequestを使って非同期通信できるような実装をしなくてはなりません
簡単にサンプルコードで書けるほど単純なものでもありません

一般的なサーバーサイドスクリプトの動作として、
ボタンを押す->サーバーへリクエストする->サーバーが処理する->クライアントに何かしらの結果を返す(出力する)です
つまり、PHP等のサーバーサイドスクリプトは、...続きを読む

Qで配列(複数の要素)を渡したいとき?

こんにちわ,

今HTML+PHPで
$hoge[]にいくつかの要素が入っているとき,
それをあるfoo.phpというページに渡したいとき,
echo '<form action="foo.php" method="POST">';
echo '<input type="hidden" name="$hoge[]" >';
echo '</form>';
としたのですが,うまくいきません。

どうしたらよろしいでしょうか。

Aベストアンサー

nameじゃなく、valueでは?
あとやるなら、
for($i=0;$i<count($hoge);$i++){
print "<input type=\"hidden\" name=\"$hoge[$i][0]\" value=\"$hoge[$i][1]\">";
}
とか?

QInner join と Left joinの明確な違いは?

Inner join と Left joinの違いがよくわかりません。
教えてください。

Aベストアンサー

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
4               NULL
5               NULL
6               NULL
の6レコードが出力されますが、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 INNER JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
の3レコードしか出力されません。

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3           ...続きを読む

Qホームページでファイルをダウンロードさせる

お世話になります。
会社のホームページを制作中です。
マニュアルなどをアップしておき、ユーザーにダウンロードしてもらうページを作ろうと思っています。
<ベクターのような>
参考になる情報ありましたら教えてください。
宜しくお願いいたします。

Aベストアンサー

ダウンロードについて、
参考URLのページに分かりやすく書いてあるようです。
例もあるのでぜひ参考にしてください。

参考URL:http://www.tohoho-web.com/wwwxx013.htm

QSELECTで1件のみ取得するには?

こんにちわ。
いまORACLE9iを使用している者です。

ACCESSでは
SELECT TOP 1 項目名 FROM テーブル名
ORDER BY 項目名;
で並べ替えたデータ群のうち,先頭の1件だけを
取ることができますが,
ORACLEでそのような機能(SQL)はあるでしょうか?
教えてください。
よろしくお願いします。

Aベストアンサー

order by と rownum を併用する場合は注意が必要です。

[tbl01]
cola | colb
------------
1000 | aaaa
1001 | bbbb

というデータがある場合、
select cola from tbl01 where rownum < 1 order by cola desc;
とすると、「1001」ではなく、「1000」が返されます。
これは、order by の前に rownum < 1 が適用されてしまうからです。

解決するには、
select aaa from (select cola aaa from tbl01 order by cola desc) where rownum = 1;
とすれば良いです。

Qheader(Location: next.php) だとPOSTした値が渡らない?

文末は(だいぶ端折ってますが),
(1) エラーがあればエラー表示,
(2) エラーがなければnext.phpに飛ぶ
という動作をするのですが, next.php 内に

echo $_POST["Name"]; とか echo $_POST["reg"]; とか書いても
valueの中身が渡ってきていません.
header("Location: next.php"); で飛ばすとだめなのでしょうか.


http://oshiete1.goo.ne.jp/qa2706500.html
でも,#2さんのアドバイスのようにしようとしましたが,
#1さんのご教示のように,セッションを利用するしかないですか?
ちょっとセッションで値の渡し方がチンプンカンプンなのですが・・・


<?php
session_cache_limiter('none');
session_start();
header("Cache-control:no-cache");
header("Pragma:no-cache");

$errFlg=false;
if ( $_POST["reg"] == "" ) $errFlg = true;

if ( !$errFlg ) {
if ( $_POST["Name"] == "" ) {
$errFlg = true;
$errStr["Name"] = "未入力";
}
}
if ( $errFlg ) {
?>
<html><body>
<form method="post" action="<?php $_SERVER["PHP_SELF"] ?>">
<?= $errStr["Name"] ?></td>
<input type="text" name="Name" value="<?php echo $_POST["Name"]; ?>">
<input type="submit" name="reg" value="登録"></td>
</form>
</body></html>
<?php
} else {
header("Location: next.php");
}
?>

文末は(だいぶ端折ってますが),
(1) エラーがあればエラー表示,
(2) エラーがなければnext.phpに飛ぶ
という動作をするのですが, next.php 内に

echo $_POST["Name"]; とか echo $_POST["reg"]; とか書いても
valueの中身が渡ってきていません.
header("Location: next.php"); で飛ばすとだめなのでしょうか.


http://oshiete1.goo.ne.jp/qa2706500.html
でも,#2さんのアドバイスのようにしようとしましたが,
#1さんのご教示のように,セッションを利用するしかないですか?
ちょっ...続きを読む

Aベストアンサー

LocationではPOSTデータは渡せません
セッションでやる方法もありますがそのプログラムなら
else {
header("Location: next.php");
}

else {
require "next.php";
}
にすればいいのではないでしょうか

Qフォームで同じ複数のnameで違うvalueの送信

始めまして、現在一個のフォーム内で複数の同じnameで、違うvalueを送信しようと苦戦しております、、普通にタグを書くだけでは
一個のnameで違うvalueの送信は、最後のvalueしか送信できないです、
phpは使用できません。javaは、、殆ど素人なので、あまり分かりません、、formを一個一個区切るのも、レイアウト上できません、、
どうすればいいのでしょうか?・・・以下タグです。
昨日から、ここから先に進めません。。
先輩方助けてください、本当によろしくお願いします。

<form action="http://hoge.net/hoge/hogecheck.php" method="post">
<input type="hidden" name="site" value="hoge">
<input name="id" type="text" id="idform" maxlength="10" />

<input type="hidden" name="kin" value="3000">
<input type="image" src="buybtn.gif" />
<input type="hidden" name="kin" value="5000">
<input type="image" src="buybtn.gif" />
<input type="hidden" name="kin" value="10000">
<input type="image" src="buybtn.gif" />
<input type="hidden" name="kin" value="20000">
<input type="image" src="buybtn.gif" />

</form>

始めまして、現在一個のフォーム内で複数の同じnameで、違うvalueを送信しようと苦戦しております、、普通にタグを書くだけでは
一個のnameで違うvalueの送信は、最後のvalueしか送信できないです、
phpは使用できません。javaは、、殆ど素人なので、あまり分かりません、、formを一個一個区切るのも、レイアウト上できません、、
どうすればいいのでしょうか?・・・以下タグです。
昨日から、ここから先に進めません。。
先輩方助けてください、本当によろしくお願いします。

<form action="http://hoge...続きを読む

Aベストアンサー

No.2の回答者です。
スミマセンm(__)m、Javaでしたね。PHPで書いてしまいました。。。

Java だったらこれで取れます。(HTML側の修正は不要です。)
String[] kin= req.getParameterValues("kin");


人気Q&Aランキング

おすすめ情報