プロが教える店舗&オフィスのセキュリティ対策術

初心者です。また、基本的にページをDREAMWEAVERで作成しているので、トンチンカンなことを言っているかもしれませんが、困っているのでどなたか教えて下さい。
私は音楽配信のページを作りたくて、作業しているのですが、ユーザーが曲をダウンロードする前に、必ずフォームを通るようにしようとしています。そこで、フォームのページで送信を押すと、すぐにダウンロードが始まるようにしたいのですが、送信ボタンを押すとすぐにダウンロードが始まるというようなことは技術的に可能なのでしょうか?不可能なのであれば、それにかわるいいシステムはどのようにできるのでしょうか?
また、そのフォームの送信を押した後にダウンロードできる曲への直リンクを防ぐ方法はhtaccessファイルでできるのでしょうか?フォームの内容はCGIで受け取りたいと今のところ考えています。根本的にCGIでうけとるときに、フォームの送信ボタンを押したあとに表示される画面の設定の仕方等を理解していないので、頭が混乱しています。
かなり抽象的な質問になってしまいましたが、どなたか救いの手をよろしくお願いします。

A 回答 (6件)

>実際、サーバ側にあって、外部からの要求に応じて内部アクセス可能なプログラムの仕組みはどうなっているのでしょうか?



サーバーサイド、クライアントサイドという言葉を聞いたことがあると思いますが、
これは、前者のサーバーサイド絡みの内容なので、サーバーマシンのOSとWebサーバ
プログラムに依存します。

一般に、クライアントがWebサーバにあるsample.htmlを閲覧したい、という要求を
http://www.hoge.com/sample.html
としてアクセスをします。
sample.htmlがプレーンなHTMLで書かれたファイルであれば、そのままクライアント
に送信します。
しかし、sample.htmlにcounter.cgiプログラムへのリンクがなされている場合
(アクセスカウンタ等)は、そのcounter.cgiの記述してある行(正しくはそうではない)
までは、そのまま送信し、counter.cgiの行で再度サーバーに送信の要求がなされます。
その際、counter.cgiが、count.fixなるファイルを読み出しそこに123と記述してあったら、
それを124に書き換えてクライアントへ124と送信するのが、アクセスカウンタの原理です。
つまり、counter.cgiはサーバーサイドで稼動するプログラムというわけです。
そして、counter.cgiがアクセス可能なファイルであれば、サーバ内の何処のファイルでも
アクセスが可能になります。
今回のケースの場合は、MP3のファイルをダウンロードしてくれる方のある程度の情報を
保存するということですので、それらをデータベースで管理した方が後々管理が楽に
なると思います。
そういう意味では、cgiよりもPHPがお勧めです。
当然、大規模になる場合は、Javaの方が良くなります。
    • good
    • 0
この回答へのお礼

いろいろと今までお付き合いいただきほんとうに感謝しています。OKWEBのありがたみが本当にわかりました!残された疑問点については、勉強したり、またここで聞いたりして解決させようと思います。
また機会があれば是非よろしくお願いします。

では!

お礼日時:2005/02/01 04:08

先に、


4.直リンクについて
の回答をします。
一般的なWebServerマシンのディレクトリ構成を例に示したいと思います。

/var/www/html/***
/home/User/public_html/***

仮に、ターゲットとなるWebServerのURLを、http://www.sample.com
とします。
一般的には、上のURLで参照されるファイルは、/var/www/html/***
の***の部分のファイルです。
つまり、http://www.sample.com/test1.html
は、/var/www/html/test1.html
をクライアントに送信しています。

次に、Userというユーザのtest2.htmlファイルを
http://www.sample.com/~User/test2.html
でアクセスできる場合、
/home/User/public_html/test2.html
を参照しています。
この場合外部からは、/home/User/public_html/以下のファイル以外には、アクセスができません。
しかし、部分的に制限を加えたいディレクトリに.htaccessファイルを置きます。

そこで、、/home/User/MP3/sample.mp3
というファイルを置いた場合、サーバの内部からでないとsample.mp3にはアクセスができません。
その内部でアクセスできるプログラムの代表例がCGIプログラムです。
(MP3というディレクトリは、public_htmlを同列にあるため、
上位のUserディレクトリまで上がれないとMP3ディレクトリ
にはアクセスができません。
外部からは、public_htmlよりに上位にはアクセスができないので、直リンクができない。という仕組です。)

言い換えると、サーバ側にあって、外部からの要求に応じて内部アクセス可能なプログラムを経由させれば、sample.mp3にアクセスできる。というわけです。

この回答への補足

毎回ありがとうございます!
仕組みがわかりました。

実際、サーバ側にあって、外部からの要求に応じて内部アクセス可能なプログラムの仕組みはどうなっているのでしょうか?もしよろしければ、この間の疑問とあわせて、またお暇なときにお答えいただけるとうれしいです!

では、よろしくお願いします!

補足日時:2005/01/16 14:25
    • good
    • 0

疑問点がはっきりしましたね。


確認が容易な順に片づけましょう。

3.フォームを含むhtmlの次に飛ぶthanks.html
について
すでにアップされたSampleコードの場合
<form action="" method="post" name="price" id="price" onSubmit="MM_validateForm('金額','','R','名前','','R','Eメールアドレス','','RisEmail');return document.MM_returnValue">

<form action="THANK.html" method="post" name="price" id="price" onSubmit="MM_validateForm('金額','','R','名前','','R','Eメールアドレス','','RisEmail');return document.MM_returnValue">
とします。
実際には、*.cgiとするわけです。

適当な、THANK.htmlを作成し、今現在お使いのwebサーバにアップしてお確かめください。

当然、データの取得、保存はできません。

ところで今日、スキー旅行に行きます。明日には帰ってきますが、続きは、明日以降にしたいと思います。

この回答への補足

せっかく解説していただいていたのになかなか話せなくて本当にすみません。ラップトップコンピュータが壊れてしまい、学校のPCから書き込んでいます。thank.htmlの表示の仕方がわかりました。ほんとうにありがとうございます!
ずうずうしいのですが、もしよろしければ、前回の補足のその他の疑問点に関してもお暇なときに教えていただければ幸いです。

毎回の丁寧な解説に本当に感謝しています。

補足日時:2005/01/13 13:10
    • good
    • 0

うーん、焦る気持ちはわかりますが、疑問点を順番に潰していきませんか?


現在、私が把握しているあなたの疑問点は次の2つだと理解しています。

1.自動ダウンロードさせる仕組
2.フォームで送信されたデータの取得と保存

基本的に、この2つは別々のメソッドで行います。
1だけなら、No.2で書いた、i)で実現できます。
しかし、データの受信と保存、(メールの送信)は、htmlファイルだけでは、無理です。

まず、上の順番に勘所をつかんでいきませんか?

この回答への補足

親切に教えてくださって本当に感謝しています!

そうですね、焦る前にどこがわからないのかを整理していきたいです。今のところ思いつくだけで4点ほど問題がありましたが、1は解決できたと思います。

1、自動ダウンロードさせる仕組み
→ANo.3で教えていただいたものを参照し、実験してみて理解できました。ありがとうございます。

2、フォームで送信されたデータの取得と保存
→実際にサーバーにアップしたことなどがないため、どのように取得し、保存するのかの具体的なイメージがわいていません。ドリームウィーバーの入門書を見て、メールでデータを取得する方法はわかったのですが、ネットで調べていると、CGIを使ったほうが、より高度なデータ処理が可能になるということが書いてありました。しかしCGIを使ってフォームの内容を取得し、保存しようとするにはWEBサーバーがCGIの利用を許可している必要があり、WEBサーバーに問い合わせてそれに合わせて作成しなければいけないということもわかりました。今わからないのがWEBサーバーの情報を参照する以前にどこまで自分でフォームを作っておけるのか、またどのように作るのかということだと思います。具体的には、~.cgiや~.plが果たす役割などがよくわからないです。
また、CGIを使って作ったフォームなどはwebサーバ(アパッチ??)かなにかをダウンロードしないと自分のパソコンでは試すことができないと友人に聞いて、そこも不確かです。

3.フォームを含むhtmlの次に飛ぶthanks.html
CGIでフォームを作ろうと思ったきっかけの一つとして、メールでフォームのデータを取得、保存するのを試した際に、送信ボタンを押した後、tanks.htmlへ飛ばす方法がよくわからなかったからです。そもそも送信ボタンにはアンカータグなどはないのにどうしthanks.htmlに飛ぶようになっているのかが疑問です。送信ボタンを押した後にthanks.htmlに飛ばすのはCGIでコントロールしているのではないかと、勝手に予想しています。さきほど理解していないといっていた、~.cgiまたは~.plにその具体的な指示が書いてあるのでしょうか?

4.直リンクについて
webルートというものがよくわかりません。ルートという言葉自体は調べて「Windows NT系OSではAdministratorアカウントがrootに相当する。」のようなことを読んだのですが、webルートとはwebサーバーにあるルートのことなのでしょうか?

お暇な時に答えていただけたらうれしいです。よろしくお願いします!

補足日時:2005/01/05 04:18
    • good
    • 0

Q1.>であれば、技術的に簡単になり、htaccessでの直リン防止をダウンロード先、またお礼画面にほどこすことができるのでしょうか?


A1.できます。そんなに難しくはありません。CGIを使わなくともできます。Q2.の回答と合わせて回答します。

Q2.>なぜ、送信ボタンを押すとすぐにダウンロードが始まるようにしようと思ったのかというと、CGIを使ってフォームの内容を回収する場合、フォームの送信ボタンを押した後に、どのようなページに飛ぶのかということがよくわからないということがありました。htmlで送信ボタンを押した後に飛ぶ先を指定できるのでしょうか?
A2.
【予備知識編】
フォームによりデータを送信する方法は、GETとPOSTの2通りありますが、GETには送信データの長さの制限があります。(IEの場合、URLを含め2083文字まで)
動作の違いは、下の【参考URL:】を参照してください。
【ソリューション編】
i)CGIを用いない場合(POST.htmlのデータは残らない)
(動作の確認として試してみてください。Perl等のCGIを稼動させると失敗した場合の切り分けが複雑になります)

POST.html→THANK.html→SONG.ZIP(MP3)
以下サンプルをアップしますので、動作を確認してください。(簡単なhtmlファイルなので、秀丸等のエディタで作成してください。)
a)POST.html(単なるリンクを張っただけ)
<a href="THANK.html">to THANK.html</a>
b)THANK.html(メッセージを5秒間表示後自動的にSONG.ZIPをダウンロードします)
<head>
<meta http-equiv="Refresh" Content="5;URL=SONG.ZIP">
</head>
<p>
アクセスありがとうございます.<br>
間もなくダウンロードが開始されます。
</p>

ii)CGIを用いた場合(送信データは、cgiから書き込んでください。)
上の*.htmlをすべて、*.cgiとして動作できます。
◎ポイント
自動的にダウンロードさせる部分は、上記の<META>タグ以外に、Locationヘッダの送信によっても可能です。
.htaccessによって、リダイレクトすることもかのうですが、曲目の変更がダイナミックにできません。
※この場合もwebルート以下にターゲットになるZIPファイルを置いた場合は、2度目以降の直リンクを防げません。webルートの上にターゲットとなるファイルを保管してください。こうすれば、直リンクが不可能になります。

【お奨め】
Perlによるcgiよりも、PHP+PostgreSQLの組み合わせの方が、送信されたデータの管理やレスポンスがクイックになります。
また、送信フォームを含んだページとメッセージ+ダウンロードページを分けると直リンクの危険がありますので、これらを一つのファイルで作ると良いです。
つまり、一つのPHP,CGIを再帰的に呼び出すということです。
イメージとしては、送信フォームと受信のルーチン+自動ダウンロードのすべてを一つのPHPかPerlでコーディングします。

参考URL:http://www.atmarkit.co.jp/fmobile/rensai/doja05/ …

この回答への補足

詳しく解説してくださり本当にありがとうございます!「POST.html→THANK.html→SONG.ZIP」の「POST.html→THANK.html」のところなんですが、フォームがあるPOST.htmlページの送信ボタンを押した際に、フォームの内容を受け取りつつ、次のTHANK.htmlにジャンプする仕組みがよくわかりません。ソリューション1では、フォームに記入された内容は得ることができないということですよね?
送信を押したら、フォームの内容を受け取り、指定したhtmlファイルに飛ぶという風にするにはどうすればよいのでしょうか?もしよろしければ仕組みを教えていただけないでしょうか。。。下に、作成したフォームのコードを書きます。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>無題ドキュメント</title>
<script language="JavaScript" type="text/JavaScript">
<!--
function MM_findObj(n, d) { //v4.01
var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_validateForm() { //v4.0
var i,p,q,nm,test,num,min,max,errors='',args=MM_validateForm.arguments;
for (i=0; i<(args.length-2); i+=3) { test=args[i+2]; val=MM_findObj(args[i]);
if (val) { nm=val.name; if ((val=val.value)!="") {
if (test.indexOf('isEmail')!=-1) { p=val.indexOf('@');
if (p<1 || p==(val.length-1)) errors+='- '+nm+' に、メールアドレスを正しく入力してください。\n';
} else if (test!='R') { num = parseFloat(val);
if (isNaN(val)) errors+='- '+nm+' must contain a number.\n';
if (test.indexOf('inRange') != -1) { p=test.indexOf(':');
min=test.substring(8,p); max=test.substring(p+1);
if (num<min || max<num) errors+='- '+nm+' must contain a number between '+min+' and '+max+'.\n';
} } } else if (test.charAt(0) == 'R') errors += '- '+nm+' は、必ず入力してください。\n'; }
} if (errors) alert('次のエラーが発生しました。\n'+errors);
document.MM_returnValue = (errors == '');
}
//-->
</script>
</head>

<body bgcolor="#000000">
<div align="center">
<p><font color="#FFFFFF" size="+1"><br>
<br>
<br>
</font></p>
<p align="center"><font color="#FFFFFF"><br>
</font></p>
<form action="" method="post" name="price" id="price" onSubmit="MM_validateForm('金額','','R','名前','','R','Eメールアドレス','','RisEmail');return document.MM_returnValue">
<p><font color="#666666">お名前(必須)</font><br>
<input name="名前" type="text" id="名前" style="ime-mode:active" size="20">
<br>
<font color="#666666"><br>
</font> <font color="#666666">メールアドレス(必須)</font> <br>
<input name="Eメールアドレス" type="text" id="Eメールアドレス" style="ime-mode:disabled" size="35">
k<br>
<font color="#666666">(お知らせメールをお送りいたします。) </font> </p>
<p>
<input type="submit" name="Submit2" value="送信してダウンロード">
<br>
<font color="#666666">送信後、ダウンロードページに飛びます!</font> </p>
<p><font color="#666666">システムが分からない方はDOWNLOADRULEをお読み下さい。</font></p>
</form>
<p></p>
</div>
</body>
</html>

補足日時:2005/01/04 05:54
    • good
    • 0

Q1.>ページで送信を押すと、すぐにダウンロードが始まるようにしたいのですが、送信ボタンを押すとすぐにダウンロードが始まるというようなことは技術的に可能なのでしょうか?


A2.可能ですが、クライアント側に何の確認もさせずにダウンロードさせたいということでしょうか?
だとしたら、クライアント側のブラウザのセキュリティポリシを変更しないといけません。
または、ブラウザに依存しないアプレットを用意する事です。
例:ActiveX(注:Windowsでしか動かない)、Java、Flash、e.t.c.

Q2.>htaccessファイルでできるのでしょうか?
A2.できません。
このような場合、最も簡単な方法はwebルートの上にファイルを置くことです。
ただし、一般的なプロバイダのHPサービスでは不可能です。

この回答への補足

回答ありがとうございます!クライアント側がダウンロードしたいということでフォームを記入してもらう予定なので、確認はしてもらっていることになると思います。セキュリティポリシとはクライアント側からしか、変更できないものですよね?いちおうFLASHは作成できる環境にいるのですが、いまいちなにをして良いのかわからないです・・・曲はMP3(zipに入れる)で配信するつもりです。

送信ボタンを押すとすぐにではなく、
フォーム(送信ボタンを押す)→フォームのお礼画面(ご協力ありがとうございましたなどがあり、ダウンロード先のLINKが貼ってある)→ダウンロード
であれば、技術的に簡単になり、htaccessでの直リン防止をダウンロード先、またお礼画面にほどこすことができるのでしょうか?

なぜ、送信ボタンを押すとすぐにダウンロードが始まるようにしようと思ったのかというと、CGIを使ってフォームの内容を回収する場合、フォームの送信ボタンを押した後に、どのようなページに飛ぶのかということがよくわからないということがありました。htmlで送信ボタンを押した後に飛ぶ先を指定できるのでしょうか?

ほんとうにわからないことだらけで、申し訳ないのですが、お暇な時に教えていただければ幸いです。

補足日時:2005/01/01 13:02
    • good
    • 0

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