5月 122011
 
シェアする


検索エンジンサイトが情報収集のために発信しているホームページに定期的にアクセスしに来る検索ボットだが、
たまに「robots.txt」を無視してアクセスを行なうものがある。

そのような接続を行なうボットからの接続を制限する為に、「robots.txt」にてアクセスが許可されていないディレクトリにトラップを設置し、トラップに引っかかった接続元は2回目からのアクセスが出来なくなるというシステムを「Blackhole」を用いて設定してみることにする。

参考にしたサイトはこちら

Blackholeを用いたトラップの設置方法は以下の手順となる。

1. robots.txtにて、特定のディレクトリへのアクセスを拒否する設定にする
2. 上記設定した拒否対象ディレクトリ配下にblackhole関連ファイル(トラップ)を置く
3. トラップの設定を変更する
4. Webコンテンツの変更

本サイトはWordPressを利用して公開しているのだが、robots.txtとしては以下を利用している。

User-agent: *
Disallow: /wp-admin
Disallow: /wp-includes
Disallow: /wp-content/plugins
Disallow: /wp-content/cache
Disallow: /wp-content/themes
Disallow: /trackback
Disallow: /comments
Disallow: /category/*/*
Disallow: /*.php$
Disallow: /*.js$
Disallow: /*.inc$
Disallow: /*.css$
Disallow: /*.gz$
Disallow: /*.wmv$
Disallow: /*.cgi$
Disallow: /*.xhtml$

Allow: /wp-content/uploads

Sitemap: https://blog.trippyboy.com/sitemap.xml.gz

「Disallow」されているディレクトリ配下やファイルには検索ボットはアクセスできない設定となっている。上記以外のrobots.txtの設定方法もあるようだが、ひとまずこれだけでいいかなと。最後にサイトマップのありかを教えてあげています。

以下に「Blackhole」導入手順を説明する。

流れとしては既述の通りだが、
本件はWordPressでの対応方法として説明する。

WordPressに限らず一般のHTMLソースでかかれたWebコンテンツや、PHPで作成されたWebコンテンツであれば
応用を利かせ利用出来るとは思うが、動作に関しては自己責任でお願いします。

1. robots.txtの作成を行なう

robots.txtで拒否(Disallow)しているにも関わらず、アクセス制限されているディレクトリへアクセスがある場合は、その接続がrobots.txtを無視していることが分る。ということを利用して、不正な検索ボットからのアクセスを拒否してしまおうという作戦だ。

Webコンテンツを公開している一番上のディレクトリ(DocumentRoot)直下に「robots.txt」を作成し、以下の既述を行なってください。既にrobots.txtが存在する場合には、記述を追加してください。

# cd /var/www/html/ ←/var/www/htmlの場合
# vi robots.txt
User-agent: *
Disallow:  /blackhole/*
#

この「http://domain.com/blackhole/」配下にアクセスした接続元がトラップにはまることになります。もし念には念をで、アクセスするはずでないであろうディレクトリにしたい場合は

User-agent: *
Disallow: /konnna_directory_naiyone/

などと設定し、「http://domain.com/konnna_directory_naiyone/」にアクセスした接続元がトラップにはまります。

2. ファイルをダウンロードし解凍します

最新バージョンのファイルは、参考としているこちらのページで適時確認してください。

DocumentRootが/var/www/htmlの場合

# cd /var/www/html ←ドキュメントルートが異なる場合は注意
# wget http://perishablepress.com/press/download-manager.php?id=62
# unzip Blackhole-v01.2.zip
# chown -R apache:apache blackhole ←「apache」以外でWebサーバを起動している場合は変更必要
# chmod g+w blackhole

# ダウンロードしたファイルを削除する場合は以下も実行
# rm Blackhole-vo1.2.zip

3. 解凍して出来たディレクトリへ移動しファイルを確認します

# cd blackhole
# ls -la
total 24
drwxr-xr-x 2 apache apache 4096 May  9 14:36 .
drwxr-xr-x 8 apache root   4096 May  9 14:37 ..
-rw-rw-rw- 1 apache apache  135 Jul 11  2010 .htaccess
-rw-rw-rw- 1 apache apache    0 Jul 17  2010 blackhole.dat
-rw-rw-rw- 1 apache apache 2644 Jul 14  2010 blackhole.php
-rw-rw-rw- 1 apache apache 6364 Jul 18  2010 index.php
#

作成されたディレクトリの中には以下のファイルが存在しておりますので確認しておきましょう

.htaccess:   このディレクトリ配下のファイル一覧表示を禁止する設定
blackhole.dat: トラップに掛かった接続元情報が保存されるログファイル
blackhole.php: 以前にトラップに掛かったことがあるかを確認するPHP
index.php:   トラップファイル。このファイルにアクセスした接続元にトラップ発動

4. index.phpの記述を変更します

トラップに引っかかったユーザへ表示するメッセージです。これを日本語にすることも出来ますが、HTMLソースの知識や文字コードの知識の補足が必要になりますのでここでは説明しません。どうしても分らないから助けて欲しいという場合は連絡ください。

1.robots.txtまでのURL(54行目) と コンタクトフォームまでのURL(56行目) を設定します。

コンタクトフォームは既に既存の場合のみ指定してください。
もしコンタクトフォームがない場合には「mailto:」に続けてメールアドレスを入力します。

【変更前】

54                          <p>This site&rsquo;s <a href="http://example.com/robots.txt">robots.txt</a> file explicitly forbids your presence at this location.
55                                  The following Whois data will be reviewed carefully. If it is determined that you suck, you will be banned from this site.
56                                  If you think this is a mistake, <em>now</em> is the time to <a href="http://example.com/contact/">contact me</a>.</p>
57

【変更後:コンタクトフォームが既存で、コンタクトフォームを用いての問合せを望む場合

54                          <p>This site&rsquo;s <a href="http://blog.trippyboy.com/robots.txt">robots.txt</a> file explicitly forbids your presence at this location.
55                                  The following Whois data will be reviewed carefully. If it is determined that you suck, you will be banned from this site.
56                                  If you think this is a mistake, <em>now</em> is the time to <a href=" https://blog.trippyboy.com/51-2/">contact me</a>.</p>
57

【変更後:メールで問い合わせを望む】

54                          <p>This site&rsquo;s <a href="http://blog.trippyboy.com/robots.txt">robots.txt</a> file explicitly forbids your presence at this location.
55                                  The following Whois data will be reviewed carefully. If it is determined that you suck, you will be banned from this site.
56                                  If you think this is a mistake, <em>now</em> is the time to <a href="mailto:root@trippyboy.com">contact me</a>.</p>
57

2.トラップにかかりましたよ報告メールの送信元送信先を設定します。

【変更前】

 135    // if bot is unique, send email and log entry
 136    if ($badbot == 0) { // check for unlisted bot
 137        global $msg, $target;
 138        $tmestamp  = time();
 139        $datestamp = date("l, F jS Y @ H:i:s", $tmestamp);
 140        $sender    = "email@example.com";
 141        $recipient = "email@example.com";
 142        $subject   = "Bad Bot Alert!";
 143        $message   = $datestamp . "nn";
 144        $message  .= "URL Request: " . $_SERVER['REQUEST_URI'] . "n";
 145        $message  .= "IP Address: " . $_SERVER['REMOTE_ADDR'] . "n";
 146        $message  .= "User Agent: " . $_SERVER['HTTP_USER_AGENT'] . "nn";

【変更後】

 135    // if bot is unique, send email and log entry
 136    if ($badbot == 0) { // check for unlisted bot
 137        global $msg, $target;
 138        $tmestamp  = time();
 139        $datestamp = date("l, F jS Y @ H:i:s", $tmestamp);
 140        $sender    = "root@trippyboy.com";
 141        $recipient = "root@trippyboy.com";
 142        $subject   = "Bad Bot Alert!";
 143        $message   = $datestamp . "nn";
 144        $message  .= "URL Request: " . $_SERVER['REQUEST_URI'] . "n";
 145        $message  .= "IP Address: " . $_SERVER['REMOTE_ADDR'] . "n";
 146        $message  .= "User Agent: " . $_SERVER['HTTP_USER_AGENT'] . "nn";

変更する部分は、参照するrobots.txtのURLの変更と、トラップ発動時にメールを送信する送信元と送信先です。
この場合はrootからrootに報告メールを送るようになっています。

5. アクセスされるコンテンツ全てに、blackhole.phpがincludeされるように設定します。

WordPressで利用する場合には、以下の記述をindex.phpの適切な場所に記述してください。

<?php include($_SERVER['DOCUMENT_ROOT'] . "/blackhole/blackhole.php"); ?>

6. 検索ボットがクロールするコンテンツに以下のような隠しリンクを設置します。

<a style="display:none;" href="http://example.com/blackhole/" rel="nofollow">Do NOT follow this link or you will be banned from the site!</a>

上記隠しリンクをクロールが見つけ出し、加えてrobots.txtのルールを無視した場合のみblackhole.phpのトラップにかかります。私は、WordPressで利用しているfooter.phpに記述しました。

7. blackhole.phpを変更し、トラップにはまったことがあるユーザが再度アクセスした際に表示されるメッセージを編集します。

表示するメッセージは人それぞれです。ディフォルトでは英語でのメッセージ表示にtwitterへのリンクだったので、そのまま真似ました。

50         <title>Access Denied</title>
51         <h1>You have been banned from this domain</h1>
52         <p>If you think there has been a mistake, send a message to
53                 <a href="http://twitter.com/trippyboy_com" title="Trippyboy_com on Twitter">@trippyboy_com</a>
54                 and we&rsquo;ll sort it out.
55         </p>

 

以上で完了です。

ちょっとはしょってますが、分ってください。

詳しくはこちら

なお、動作検証には、

1.http://~~~/blackhole/ にアクセスする。
2.エラー画面を確認
3.TOPページが見れないことを確認
4.blackhole.datに記録されたIPアドレスを削除

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

コメント大歓迎!質問も受け付けておりますヽ(*´∀`)ノ