[ CGI集 | CGI解説 | Perl解説 | HTML解説 | LinuxMemo | Q&A | QuizLink ]      

不正リンク防止CGI T-FileSafe Ver.1.00 説明書

about...

機能

 自分のページ内においてある JPEG, GIF, MIDI ファイル等を、他のページから直接リンクを張られて不正に使用されることから守るためのCGIです。ダウンロード数の集計もできます。主な特徴は以下の通り。

  • リンク元のURL、アクセスする人のIPアドレスホスト名によって、アクセス許可、不許可の条件を設定可能。
  • MIME-TYPEを追加することによって、どんなタイプのファイル(wav, ra等)でも使用可能。
  • 拡張子別に制限の種類を変更することが可能。
  • Content-Length, Last-Modified も出力。MP3のストリーミング等にも使用可能。
  • ダウンロードされるときのデフォルトのファイル名が元のファイル名と変わらない
  • アクセスログを取ることも可能。時間、ホスト、リンク元などを記録。
  • ファイル別アクセス数の集計が可能。日別、総合、ファイル名検索。

[index]

用途

例えば以下のように使えます:

  • 自分のページに掲載しているCGがどれくらいの人に見てもらえたかを知りたい。
  • 知らないサイトから自分のサイト内のjpgファイルに勝手にリンクが張られている。ファイルの置く場所を変更してもしつこく追随してくる。なんとかしたい。
  • 特定の友達(がいるホスト)のみにmp3ファイルのダウンロードを許可したい。
  • 公開している着メロファイルがどれくらいの数ダウンロードされているのかを知りたい。

[index]

動作環境に関する注意

 このプログラムは、通常のHTML用ディレクトリ(public_html等)の外にファイルを置ける環境への設置を推奨します。ユーザのホーム直下がHTML用のディレクトリになっている場合や、public_html 以外の場所にファイルを置けない場合(Biglobeなど)はセキュリティ、カウント数管理が少々甘くなります。(ただ、実質的はほぼ問題ないと思われます。)後に挙げた二つような環境の場合の設置のコツについてはこちらをご覧下さい。

[index]

ソース

(ダウンロード後、ファイル名が "-cgi.txt" となってるものを ".cgi" に変更してください)

全ファイルをまとめてダウンロード 〜 filesafe100.lzh

プログラム

[index]

インストール方法

インストール

  1. まず、プログラムを置くディレクトリ、データファイルを置くディレクトリ、制限をかけたいファイルを置くディレクトリ、の3つを決める。制限をかけたいファイルを置くディレクトリ一般のHTMLファイルを置くディレクトリの外に置くこと。(それが不可能な環境の場合はこちらを参考にしてディレクトリを決めて下さい。)

    ※ 例として次のような環境を考える。
      プログラムを置くディレクトリ:/home/who/public_html/cgi-bin/filesafe
      データファイルを置くディレクトリ:/home/who/public_html/cgi-bin/filesafe(上と同じ(※推奨※))
      制限するファイルを置くディレクトリ:/home/who/tfsdata
    以下の説明は各自の環境に合わせて置き換えて読んで下さい。

  2. ソースからtfsafe.cgitflog.cgimytools.gifの三つのファイルをダウンロードする。
    ※ ダウンロード方法はソースをダウンロードするを参照。

  3. tfsafe.cgitflog.cgi ファイルの最上部のPerlのパスを正しく設定する。
    ※ 詳しくはPerlのパスを設定するを参照。

  4. tfsafe.cgiをテキストエディタで開き、以下の変数を編集してください。

    • $basedir ..... データファイルを置くディレクトリへのパス(※注1)
    • $rootdir ..... 1.で作った tfsdata までのフルパス (※注2)

    ※注1 データファイルをプログラムと同じディレクトリに置く場合は $basedir=".";のままで。下も同様。
    ※注2 例では $rootdir = "/home/who/tfsdata"; となります。

  5. tflog.cgiをテキストエディタで開き、以下の変数を編集してください。

    • $basedir ..... データファイルを置くディレクトリへのパス
    • $baseurl ..... データファイルを置くディレクトリにあたるURL(※注3)
    • $backurl ..... 「戻る」を押したときに移動する先のURL

    ※注3 $basedir = ".";の場合、ここも$baseurl = "."でよいです。

  6. tfsafe.cgitflog.cgiをプログラムを置くディレクトリ (この例では /home/who/public_html/cgi-bin/filesafe とする) にFTPのアスキーモードで転送する。パーミッションを705にする。

    (telnetの場合)
    % chmod 705 tfsafe.cgi
    % chmod 705 tflog.cgi

  7. 空ファイル access.txterror.txt を作成し、$basedir で指定したディレクトリ($basedir = "."; の場合は *.cgi ファイルと同じディレクトリ、この例では /home/who/public_html/cgi-bin/filesafe) にFTPで転送する。パーミッションを606に設定する。

    (telnetの場合)
    % chmod 606 access.txt
    % chmod 606 errors.txt

  8. 制限をかけたいファイルを置くディレクトリ(この例では /home/who/tfsdata) を作成する。パーミッションを707にする。

    (telnetの場合)
    % mkdir tfsdata
    % chmod 707 tfsdata

  9. 空ファイル config.txt を作成し、制限をかけたいファイルを置くディレクトリ(この例では /home/who/tfsdata) にFTPのアスキーモードで転送する。パーミッションを604に設定する。

    (telnetの場合)
    % chmod 604 config.txt

  10. テスト用GIFファイル (mytools.gif) を、データ用ディレクトリ(この例では /home/who/tfsdata)にFTPのバイナリモードで転送する。パーミッションを604にする。

    (telnetの場合)
    % chmod 604 mytools.gif

  11. ブラウザからtfsafe.cgiにアクセスしてみる。
     → 「Access Denied」と表示されればOK。
       ※ 上のように表示されない場合、ブラウザでアクセスするを参照して問題を解決してください。

  12. ブラウザからtfsafe.cgi/mytools.gifにアクセスしてみる。
     → これが表示されればOK。

  13. ブラウザからtflog.cgiにアクセスしてみる。
     → 「T-FileSafe Log Page」というタイトルのログ閲覧画面が出て、先ほどの mytools.gif のカウント数が出ていればOK。

以上でインストールは完了です。


ディレクトリ構成

ディレクトリ構成は以下のようになります。($basedir="."; の場合。)
カッコ内の数字はパーミッション、<〜> はディレクトリ
+ <public_html>
|    + <cgi-bin>
|         + <filesafe>
|              + tfsafe.cgi (705)
|              + access.txt (606)
|              + errors.txt (606)
|
+ <tfsdata> (707)
     + config.txt (606)
     + mytools.gif (604)

[index]

使い方

制限対象のファイルを置く

 あるファイルに対してアクセス制限をかける、または、ダウンロード数をカウントさせる方法は以下の通りです:

  1. ファイルを制限をかけたいファイルを置くディレクトリ(この例では /home/who/tfsdata)にFTPで転送する。

  2. ブラウザから、tfsafe.cgi/<ファイル名> にアクセスして、表示されるかどうか確かめる。

  3. それぞれのファイル形式に応じてタグを書く。

※ 対応しているファイルタイプ(拡張子)は、txt, html, htm, mid, jpg, gif, png, lzh, zip, mp3, mmfです。これ以外のファイルを置きたい場合はmime-typeを追加する必要があります。詳しくはこちら
tfsdata の下にディレクトリを作ることもできます。その場合、新しく作ったディレクトリのパーミッションは707にして下さい。

タグの例

tfsafe.cgi が、http://www.foo.com/~who/cgi-bin/filesafe/tfsafe.cgi に、
tfsdata が、/home/who/tfsdata/ にある場合。

・画像 /home/who/tfsdata/title.gif を表示させたいとき

<IMG SRC="http://www.foo.com/~who/cgi-bin/filesafe/tfsafe.cgi/title.gif">

・/home/who/tfsdata/lzh/data.lzh にリンクを張るとき

<A HREF="http://www.foo.com/~who/cgi-bin/filesafe/tfsafe.cgi/lzh/data.lzh">

・/home/who/tfsdata/mp3/mysong.mp3 をRealAudioでストリーム再生させたいとき

<EMBED src="http://www.foo.com/~who/cgi-bin/filesafe/tfsafe.cgi/mp3/mysong.mp3" type="audio/x-pn-realaudio-plugin" autostart="true" hidden="true" nojava="true">

[index]

 

制限ルールの設定方法 〜 config.txt

 アクセス制限は、config.txt を編集することによって条件を設定することができます。

<制限ファイルの例> ※カンのいい方はこれだけで分かると思います

TARGET:mid    ← 拡張子 mid に対する制限
deny from HOST .hacker.com
   → .hacker.com を含むホストからのアクセスを拒否する

deny from HOST .warumono.ne.jp
   → .warumono.ne.jp を含むホストからのアクセスを拒否する



TARGET:mp3 lzh jpg
   → 拡張子 mp3 lzh jpg に対する制限

allow from URL www.mytools.net
   → www.mytools.net を含むURLからのリンクのみを許可する

deny from ADDR .210.2.129
   → .210.2.129 を含むIPアドレスからのアクセスを拒否する


TARGET:*    ← 上記以外の全ての拡張子に対する制限
allow from URL www.mytools.net
   → www.mytools.net を含むURLからのリンクのみを許可する



手順は以下の通り:

  1. まず制限対象の拡張子を決めて、以下のように書く。
    TARGET: <制限対象とする拡張子>
    "TARGET:"は大文字で、拡張子は小文字で書くこと
    ※ 拡張子が複数ある場合は半角スペース区切り
    ※ 拡張子を "*" と書くと、それより上に書いた制限の対象拡張子以外の全ての拡張子が対象になる

  2. その下に制限の内容を以下の文法に従って制限内容を書く。
    [allow|deny] from [URL|ADDR|HOST] <keyword>

    書き方の例は以下の通り:

    ### URL ...リンク元による制限
    allow from URL .geocities.ne.jp
       → .geocities.ne.jp を含むURLからのみリンクを許可する

    deny from URL 2ch.net
       → 2ch.net を含むURLからのリンクを禁止する

    ### ADDR ... アクセス元IPアドレスによる制限
    allow from ADDR .120.123.234
       → .120.123.234 を含むIPアドレスからのみアクセスを許可する

    deny from ADDR .100.111.122
       → .100.111.122 を含むIPアドレスからのアクセスを禁止する

    ### HOST...アクセス元ホストによる制限
    allow from HOST .nifty.com
       → .nifty.com を含むホストからのみアクセスを許可する

    deny from HOST .virus.com
       → .virus.com を含むホストからのアクセスを禁止する

    ※ 行頭に # がある行はコメント行として扱われます。

  3. 別の拡張子に対する制限を加えたい場合はまた1.の TARGET: から書く。

[index]

 

複雑なルールの設定方法

複数のルールを組み合わせる

 一つの拡張子に対して、URL,ADDR,HOST の条件を自由に組み立てることができます。
(よい例)

TARGET: lzh zip
allow from URL mytools.net
   → URLに mytools.net を含むリンク元からのアクセスを許可するが、

deny from HOST hacker.com
   → ホストに hacker.com を含むアクセスと

deny from ADDR .222.222.222
   → IPに 222.222.222 を含むアクセスは不許可

但し、同じ情報(URL,ADDR,HOST)に対して、allow、deny の双方を設定しても、denyのほうは無意味です。
(間違った例)

TARGET: png gif jpg
allow from URL www2s.biglobe.ne.jp
   ↑ この allow で www2s.biglobe.ne.jp 以外からのリンクが全て不許可

deny from URL www.crack.com    ← この deny は無意味

URL, ADDR, HOST が不明な場合の条件を設定する

 たまにURL,ADDR,HOSTの情報が不明なアクセスが来ることがあります。「:unknown:」というキーワードを使うことにより、情報不明のアクセスに対する処置方法を決定できます。
deny from URL :unknown:    ← リンク元不明なアクセスは拒否する
deny from ADDR :unknown:    ← IPアドレスが不明なアクセスは拒否する
deny from HOST :unknown:    ← ホストが不明なアクセスは拒否する

 主に使うのは「URL」になると思います。次のような場合、リンク元のURLが不明になります。

  • 直接URLを入力した場合。
  • <EMBED SRC="〜"> でリンクされた場合。
 ですので、MIDIやMP3をEMBEDタグで自動演奏させる場合などは、「deny from URL :unknown:」 にすると再生されません。(本来この用途で使いたいために開発したのですが。。。無念。)

[index]

 

エラーIDの意味

 tfsafe.cgi によってアクセスが拒否された場合、「Access Denied.」の文字とともに、拒否された理由が error ID として表示されます。error ID の意味は次の通りです。

  • 00 ... ファイル名が指定されていない
  • 01 ... パスに不正な文字が含まれている
  • 02 ... 指定されたファイルが存在しない
  • 03 ... 指定されたファイルを開けない (→そのファイルのパーミッションが604になっていない)
  • 04 ... ファイルを開けない
  • 05 ... ファイルタイプが不明 (→そのファイルの拡張子をmime-typeとして登録していない)
  • 11 ... IPアドレスが許可されていない
  • 12 ... IPアドレスが不許可になっている
  • 21 ... ホスト名が許可されていない
  • 22 ... ホスト名が不許可になっている
  • 31 ... リンク元が許可されていない
  • 32 ... リンク元が不許可になっている
  • 99 ... config.txt が開けない (→config.txtのパーミッションが適切でない、ファイルの場所が間違っている)

 このerror IDは、エラーログにも記録されます。

 また、tfsafe.cgi の $SHOW_DETAIL_MESSAGE を 1 に設定すると、エラー時の画面に詳細メッセージも表示されるようになります。デバッグ時には便利ですが、不正アクセスに対して何故拒否されたのかを公開してしまうことはセキュリティ的にあまりよろしくないと思います。(デフォルトは 0 になってます。)

[index]

 

アクセスログ、エラーログを見る

 tfsafe.cgi を通してファイルにアクセスしてきた人のログは access.txt に、アクセス拒否のログは errors.txt に蓄積されています。それぞれ時刻、ホスト名、リンク元などが記録されています。管理画面(tflog.cgi)の上部から直接リンクが張られています。放っておくとどんどん大きくなります(100件で10KB位)ので、定期的に同名の空ファイルを上書きFTPして削除してください。

access.txt の例errors.txt の例

また、tflog.cgi からは、ファイル別のアクセス数を確認できます。また以下の二つのフォームがあります:

  • 検索 ... ファイル名を絞ります。特定のファイルについてのみのカウント数を表示することが可能です。

  • 連続アクセス排除 ... ブラウザによってはファイルへの一回のアクセスで二度の痕跡を残すものがあるようです。(原因不明。)アクセス数をより正確に計るために、ここに設定されている秒数以内に同じIPから同じファイルに連続でアクセスがあった場合、カウント対象としません。経験則的にデフォルトは60秒にしてあります。

[index]

 

扱えるファイルタイプを増やす

 T-FileSafe は、デフォルトで拡張子が txt, html, htm, mid, jpg, gif, png, lzh, zip, mp3, mmf のものを扱うことができます。これ以外の他の種類のファイル(ra, wav等)にも使えるようにしたい場合、tfsafe.cgi の下の方にある set_mime_header 関数 にファイルの拡張子と mime-type の関係を、以下のように記述します。

$HEAD{'<拡張子>'} = "<MIMEヘッダ>";

 各拡張子に対応するMIMEヘッダは、ここ等を参考にするとよいでしょう。

※ どうしてもわからない場合は、掲示板で質問してください。

[index]

Note...

EMBEDタグのリンク元URLは :unknown: になります

 この T-FileSafe は元々、私のところにあるMIDIファイルが、他のサイトから直接リンクされてダウンロードできるようになっているのを発見し、それに対抗するために作成したものなのですが、完成させてから使ってみたら、MIDIを演奏させるために使っているタグ、<EMBED SRC="〜"> は、リンク元 (HTTP_REFERER) が記録されない、ということに気が付きました(;_;)。

 しかし、MIDIファイルにEMBEDでリンクされても演奏されるだけでダウンロードはできないし(キャッシュには残りますが)、ダウンロードさせるためには A HREF でリンクを張るしかなく、それは完全に防ぐことができるので、よしとすることにしました。

 ですから、MIDI等の、EMBED と A HREF の両方で呼び出す可能性のあるファイルの場合、「allow from URL :unknown:」の条件を config.txt に加えておかないと、EMBED で再生できなくなるので注意してください。

(実用例)

TARGET:mid
allow from URL http://www2s.biglobe.ne.jp/~tnishida/ ← A HREF 用に自分のページがあるURL二つ
allow from URL http://www.mytools.net/
allow from URL :unknown: ← EMBEDタグ用に :unknown: も許可

[index]

 

ログを一般の人に見せないようにするには

 用途によっては、アクセスログ等を訪問者に見せたくない場合もあります。その場合はログファイル名の変更と、ログ閲覧用のプログラム(tflog.cgi)の名前変更を行って下さい。手順は以下の通り。

  1. アクセスログ、エラーログ、ログ閲覧CGIのそれぞれの新しいファイル名を決める。

  2. tfsafe.cgi、tflog.cgi の上のほうにある以下の部分を編集して、それぞれ新しいファイル名に合わせて変更する。
    # エラーログの位置
    $errorlog = "$basedir/errors.txt";
    # アクセスログの位置
    $accesslog = "$basedir/access.txt";
    # このファイルの名前 ← これは tflog.cgi のみ
    $cginame = "tflog.cgi";

  3. tflog.cgi の名前を新しいファイル名に変更する。

  4. エラーログ、アクセスログの新しい名前で空ファイルを作成する。

  5. 従来の名前のファイルがあった同じ場所に同じファイルを配置する。パーミッションも同じに設定する。

[index]

 

HTML用ディレクトリの外にファイルを置けない場合の設置のコツ

 サーバによってはHTML用のディレクトリ(public_html)の外にファイルを置けない場合があります。その場合は、制限したいファイルを置くディレクトリの名前を複雑にすることによって、ダイレクトにアクセスされる可能性を低くすることができます。

(例)
$rootdir = "/public_html/cgi/filesafe/wofdlv34kbjaghdnvuy5gtehag2bjyvnweuytrma_hjegrj/tfsdata";

 但し、何らかの原因でこのディレクトリ名がバレてしまった場合は、制限が全く聞かず、カウントもされませんのでご注意下さい。万が一バレたときのことを考えて、filesafe 以下の各ディレクトリに index.html という名前の空ファイルを置いておくと、ディレクトリの一覧表示がされず、多少安全になると思います。

[index]

 

バージョン情報

バージョン履歴

  • (2002/10/2) Ver.1.00
     バージョンアップ。拡張子別にルールを変える機能、ログ閲覧機能を追加。

  • (1998/2/26) Ver.0.01
     新規登録。

[index]

 

バージョンアップ方法

0.01 → 1.00

 0.01と1.00はログファイル、設定ファイル共に互換性がありません。最初からインストールをやり直してください。但し、プログラム名等は変わっていないので、リンク等のHTMLは変える必要はないと思います。

[index]