spamが来る。
それはもうたくさん来る。
spamassassinではじいているので、読まなければいけないと言うことはないのだが、気分が悪い。
で、世の中にはアドレス収集ロボットとか言うものがあるらしい。
いろいろなリソースからメールアドレスを収集するものだと思うのだが、幸いうちには来ていないらしい
なんで来ていないと判断できるかと言うと、うちのwebページにはいくつかのメールアドレスが載っているのだが、そこにはメールが来ないから。
ちなみに、会社のメールアドレスには嫌ってほどspamが来る。昔、net newsとかに投稿したのがまずいのかしらん?

前置きが長くなったが、アドレス収集ロボットを捕獲するなんて言うページを見つけたので、必要ないのにphpの勉強もかねてうちにも設置してみた。
ログをどのように取るか悩んだのだが、後からの利用しやすさを考えて、DBに入れることにした。
PostgreSQLに新しいユーザとDBを追加して、以下のテーブルを作る。
create table log (
  id int,
  time timestamp,
  remote_addr text,
  user_agent text,
  via text,
  forward text
);
create sequence log_id;
続いて、餌用のページを作る。
<html>
<head>
<meta http-equiv="Context-Type" content="text/html" charset="shift_jis">
<meta name="robots" content="noindex,nofollow">
<title>trap</title>
</head>
<body>
このページは、アドレス収集ロボットに対する罠です。<br>
以下のアドレスにメールすると、spamを送付するサイトとして記録します。<br>
<br>
This page is trap for collect address robots. Do not send any emails to following address.<br>
<br>

<?php
  $addr = getenv("REMOTE_ADDR");
  $useragent = getenv("HTTP_USER_AGENT");
  $via = getenv("HTTP_VIA");
  $forward = getenv("HTTP_X_FORWARDED_FOR");
  $conn = pg_connect("dbname=trap user=trap");
  if ($conn) {
    $rec = pg_query($conn, "select nextval('log_id');");
    if ($rec) {
      $row = pg_fetch_array($rec, 0);
      $id = $row[0];
      $query = sprintf("insert into log (id, time, remote_addr, user_agent, via, forward) values (%d, 'now', '%s', '%s', '%s', '%s');", $id, pg_escape_string($addr), pg_escape_string($useragent), pg_escape_string($via), pg_escape_string($forward));
      pg_query($conn, $query);
    }
    pg_close($conn);
  }
  echo "<a href=\"mailto:trap+$id@wizard-limit.net\">trap+$id@wizard-limit.net</a>";
?>
</body>
</html>
肝は、
  • metaタグを使って通常の検索ロボットには収集されないようにすること。
  • アクセスをDBに記録する。
  • DBに記録した情報とリンクするメールアドレスを生成し、餌としてまく。
このスクリプトで、trap+?@wizard-limit.netと言うメールアドレスが生成されるので、trapと言うユーザを作り、メールを受け取れるようにする。
※ trap と言うユーザが、trap+?の形式のメールを受け取れるようにするのは、postfixの設定。
あとは、トップページからリンクを張って出来上がり。
リンクを張るときには、通常のサイト訪問者がたどらないように、aタグと/aタグの間には何も入れないこと。
これで、このページを踏んでメールを送ってくれば、ログと比較することでどのIPから収集されたかがわかる。
ちなみに、ログを参照するためのページは以下のような感じ。
<html>
<head>
<meta http-equiv="Context-Type" content="text/html" charset="shift_jis">
<meta name="robots" content="noindex,nofollow">
<title>trap</title>
</head>
<body>

<?php
  $conn = pg_connect("dbname=trap user=trap");
?>
IP一覧
<table border cellspacing="0">
<tr><th>address</th><th>#</th></tr>
<?php
  $rec = pg_query($conn, "select count(id) as c, remote_addr from log group by r
emote_addr order by c desc;");
  $rows = pg_num_rows($rec);
  for ($i = 0; $i < $rows; $i++) {
    echo "<tr>\n";
    $row = pg_fetch_array($rec, $i);
    echo "<td>$row[1]</td>\n";
    echo "<td>$row[0]</td>\n";
    echo "</tr>\n";
  }
?>
</table>
User agent一覧
<table border cellspacing="0">
<tr><th>User agent</th><th>#</th></tr>
<?php
  $rec = pg_query($conn, "select count(id) as c, user_agent from log group by us
er_agent order by c desc;");
  $rows = pg_num_rows($rec);
  for ($i = 0; $i < $rows; $i++) {
    echo "<tr>\n";
    $row = pg_fetch_array($rec, $i);
    echo "<td>$row[1]</td>\n";
    echo "<td>$row[0]</td>\n";
    echo "</tr>\n";
  }
?>
</table>
ログ一覧
<table border cellspacing="0">
<tr><th>id</th><th>time</th><th>address</th><th>user agent</th><th>via</th><th>f
orward</th></tr>
<?php
  $rec = pg_query($conn, "select * from log order by id desc;");
  $rows = pg_num_rows($rec);
  for ($i = 0; $i < $rows; $i++) {
    echo "<tr>\n";
    $row = pg_fetch_array($rec, $i);
    echo "<td>$row[0]</td>\n";
    echo "<td>$row[1]</td>\n";
    echo "<td>$row[2]</td>\n";
    echo "<td>$row[3]</td>\n";
    echo "<td>$row[4]</td>\n";
    echo "<td>$row[5]</td>\n";
    echo "</tr>\n";
  }
?>
</table>
<?php
  pg_close($conn);
?>
</body>
</html>

このままだと、連続でアクセスされた場合にDBが膨れ上がってしまう。
テーブルに参照回数などのフィールドを追加し、同じサイトからのアクセスの場合はレコードが増えないようにした方が良いかもしれない。
まあ、今のところはまったくアクセスがないようなので、この状態でしばらく様子を見てみることにしよう。

カテゴリ

トラックバック(0)

このブログ記事を参照しているブログ一覧: アドレス収集ロボット対策Ver.0.01

このブログ記事に対するトラックバックURL: https://www.wizard-limit.net/cgi-bin/mt/mt-tb.cgi/669

コメントする

このブログ記事について

このページは、falseが2004年6月24日 11:14に書いたブログ記事です。

ひとつ前のブログ記事は「mailmanバージョンアップ」です。

次のブログ記事は「mailmanのバグ?」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

広告

Powered by Movable Type 6.1.1