ダウンロードツール対策 - PHPプロ!Q&A掲示板

1958

  • 0P

ダウンロードツール対策

質問日時 / 2009年4月2日 13:41    回答数 / 5件

Questioner:  ibms30  このエントリーをはてなブックマークに追加 

キーワード / キーワードが設定されていません

Linuxを使い知り合いとかが作った音楽や動画を配布するサイトを運営する準備をしています。

WebをみるとDoSアタック対策、ダウンロードツール対策(PHP/CGI経由でのダウンロード)をするほうがいいとの書き込みを見つけました。
DoSアタック対策はApacheのモジュールで対応したのですが、ダウンロードツール対策としてのPHP/CGI経由でのダウンロードってのがいまいちわかりません。

参考になるHPやコードを公開している場所があれば教えていただけませんでしょうか。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01NurseAngelこの意見は投稿者によって削除されました。
┃┗A01-1marcorossiこの意見は投稿者によって削除されました。
┣A02mgngmgngPHP経由でファイルをダウンロードさせるスクリプトは
┗A03NurseAngel特に参考サイト等が見つからなかったので以下は妄想で
 ┗A03-1wintermute>>CODE //リクエストにワンタイムトークンが入って
  ┗A03-1-1NurseAngelだからいい加減だって言ってるのに。 駄目な理由もす
   ┗A03-1-1-1wintermute>5分かそこらで書いたコードに実用性を求められまして
    ┗A03-1-1-1-1jiro260この意見は投稿者によって削除されました。
     ┗A03-1-1-1-1-1marcorossiこの意見は投稿者によって削除されました。

回答一覧

並び替え:

A01
answererNurseAngel [4月2日 16:39] (最終編集:4月2日 16:42)

この意見は投稿者によって削除されました。

ツリーへ TOPへ

A01-1
replyermarcorossi [4月9日 17:55]

この意見は投稿者によって削除されました。

ツリーへ TOPへ

A02
answerermgngmgng [4月2日 16:50]

PHP経由でファイルをダウンロードさせるスクリプトは
以下が参考になります。
http://d.hatena.ne.jp/cocoiti/20080221#1203611811
http://jp2.php.net/readfile#function.readfile.examples


ダウンロードツール対策ですが、
Cookie使ったセッション管理が妥当でしょうか。
# Cookie設定できるダウンロードツールだと
# まったく意味ないですが...

Web上にソースがみあたらなかったので
とりあえず簡単な流れだけ。


任意のページでアクセス元の固有情報を取得して
(IPアドレスとかユーザエージェントとかその辺の複合情報)
セッションに保存

ダウンロードスクリプトにリクエストが来たら
アクセス元の固有情報をもう一回取得して
セッション値と一致するかチェック

一致すればダウンロード、
一致しなかったら404ヘッダを吐くなど

この意見に回答する

ツリーへ TOPへ

A03
answererNurseAngel [4月2日 16:57] (最終編集:4月2日 17:06)

特に参考サイト等が見つからなかったので以下は妄想です。

・まずダウンロードさせるファイルは公開ディレクトリに置かない。もしくは.htaccess等で接続制限
 (公開ディレクトリに置いている=公開している、です)

・ダウンロード直前のページでワンタイムトークンを発行、フォームに仕込む
・ダウンロードリンクは直接コンテンツではなくダウンロード用スクリプトに張る
・ダウンロード用スクリプトはワンタイムトークンをチェックしてOKだったらダウンロードさせる


index.php
  1. <?php
  2.   //ワンタイムトークン発行
  3.   $token=rand();
  4.   //$tokenをどっかに保存
  5.   file_put_contents('token.txt',$token,FILE_APPEND);
  6.  
  7.   print('
  8.     <form method="POST" target="download.php">
  9.       <input type="hidden" name="id" value="'.htmlspecialchars($id).'">
  10.       <input type="hidden" name="token" value="'.htmlspecialchars($token).'">
  11.       <input type="submit" name="submit" value="ダウンロードする">
  12.     </form>
  13.   ');


download.php
  1. <?php
  2.   //リクエストにワンタイムトークンが入ってなければ死
  3.   if(!in_array($_REQUEST['token'],file('token.txt')){
  4.     die();
  5.   }
  6.   //その他認証
  7.   //
  8.   
  9.   //$_REQUEST['id']とかから該当のコンテンツを引っ張ってくる
  10.   header("MP3のヘッダとか");
  11.   readfile("MP3のファイル")

まあ、よくあるアップローダみたいな作りです。
上記は今適当に書いたのでワンタイムトークンの作り方が好い加減すぎたりtoken.txtが際限なく増えたり有効期限が無期限だったりそもそもtoken.txtが外から丸見えだったりしますがそこらへんはどうにかしてください。
どうせコンテンツを引っ張ってくるのにDBを使うことになると思いますのでDBに入れるとよいでしょう。

あとは、その他認証部分に

・ひとつのIPアドレスから同時に複数要求とかが来てたら死
・リファラが正しく入ってるかチェック
・一回ダウンロードしたらそのtokenは無効化
・レジューム要求とかが来たら200なり416なりを返す
・トークンを発行するついでにCookieも出してみる

あたりを好みで追加したりするといいかもしれません。

もっと強固にしたいなら、CAPTCHAでも付ければそこらのダウンロードツールでは太刀打ちできないでしょう。


#ここまで書いて、トークンはあんまり意味ねえなということに気がついた。
#JavaScript使ってトークンをDOMで追加とかはどうだろう。

この意見に回答する

ツリーへ TOPへ

A03-1
replyerwintermute [4月2日 17:16]

  1. //リクエストにワンタイムトークンが入ってなければ死 
  2.   if(!in_array($_REQUEST['token'],file('token.txt')){ 
  3.     die(); 
  4.   }
具体的なコードまで書いておきながらいい加減すぎませんか?
(ファイルのロックもしてないし、古いトークン情報が残ったままだし。)

念の為書いておきますが「これは実用に耐えないコード」です。

# まぁ、セッション使えばいいだけかと

この意見に回答する

ツリーへ TOPへ

A03-1-1
replyerNurseAngel [4月3日 01:58]

だからいい加減だって言ってるのに。
駄目な理由もすぐ下に書いてますし、5分かそこらで書いたコードに実用性を求められましても。
ただLOCK_EXは忘れてました。失礼。

てか、ファイルに保存とかログ以外使わない…


#確かに、セッションに突っ込んだ方がよほど手っ取り早かったですね

この意見に回答する

ツリーへ TOPへ

A03-1-1-1
replyerwintermute [4月3日 16:15]

>5分かそこらで書いたコードに実用性を求められましても。
「5分かそこらで書いた」などという事は、書かれている事からうかがい知る事はできませんよね?

# ちょっと、言い訳もいい加減すぎませんか?

この意見に回答する

ツリーへ TOPへ

A03-1-1-1-1
replyerjiro260 [4月5日 03:12]

この意見は投稿者によって削除されました。

ツリーへ TOPへ

A03-1-1-1-1-1
replyermarcorossi [4月9日 17:54]

この意見は投稿者によって削除されました。

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
include されたファイルの変数
 このエントリーをはてなブックマークに追加 
A
出来ます。include(require)は、その部分に読み込むファイルの内容を展開したのと同義です。エディタでファイル読み込み(あるいはコピペ)した状態と同じだと考えていいです。 #defineや変数定義だけの共通フ...

>>続きを読む

shimix様、いつもわかりやすい説明をありがとうございます。 「includeはエディタでコピペした状態と同じ」 この表現、私も授業で使わせていただきたいと思います。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)