スパムがくる原因

スパムはメールアドレスを収集されることにより、やってきます。アドレス収集の手段のひとつが、ウェブページをリンクをたどって自動的に巡回し、読み込んだ HTML ファイルのなかからメールアドレスを抜き出す「スパムロボット」です。そういうわけで、ウェブで公開する HTML ファイル(掲示板への投稿含む)にメールアドレスを出すと、どうしてもスパムが来るようになります。

パソコンウイルスも HTML ファイルからメールアドレスを抽出して利用します。こちらはパソコン使用者がブラウザで閲覧したときにパソコンに取り込まれた「インターネット一時ファイル」や「マイドキュメント」フォルダのファイルを中心に読みとるようです。Outlook Express のアドレスブックに登録されているメールアドレスや、こうやって抽出したメールアドレスに、ランダムでウイルスつきのメールを発信して感染を広めようとするわけです。

いずれにしても、メールアドレスをそのままの形でウェブ上で公開すると、いろいろやっかいです。しかし、連絡手段としてのメールアドレスを公開することは、やっぱり必要なことも多いんじゃないでしょうか、

メールアドレスを公開しつつ、スパムロボットやウイルスに利用されにくくするためには、HTML ファイルのメールアドレスを デシマルコード にするという方法があります。この方法で記述したメールアドレスは、ブラウザから見るのではなくテキストファイルとして読みとったときに、メールアドレスが「メールアドレス」として認識されにくく、抽出されにくいのです。(スパムロボットやウイルスのほうでこういう表記でも変換できる機能がついてしまうと防御できなくなりますが、現在はまだ有効なようです。)

デシマルコードというのは、文字を HTML で表記するときにその文字のコード番号そのものを指定するタグです(日本語などについては使用する文字コードに依存)。HTML での文字表記としてはこのほかに文字エンティティというのがあり、これは特殊文字について「名前」で指定します。たとえば、「and」の意味がある & (ampersand) はデシマルコードでは " ですが、エンティティで書くと & となります。

「デシマル / decimal」は「10 進数による」という意味で、16 進だと「ヘキサデシマル」、2 進だと「バイナリ」となります。

このへんの表は 【 W3C Character entity references in HTML 4 】 にあります。

で、たとえば kaburaya という文字列をデシマルコードに変換すると k が k、a が a、b が b ……などとなります。が、これを手作業でやるとたいへん面倒ですし、間違えやすいので、できるだけパソコンにやらせましょう。

テキストエディタのマクロで

テキストエディタでマクロが使えるものであれば、この操作をマクロにやってもらうことができます。まずわたしがふだん使っている QX エディタでやってみます。

proc main
    dim s$
    do while @Code > &h20 and @Code < &h7f
        s$ = s$ + "&#" + cformat$("%d",@Code) + ";"
        @MoveRightChar
    loop
    @Insert " " + s$
end proc

上の解説を行ごとに解説すると次のようになります。

  1. マクロのプロシージャの開始宣言。QX のマクロは Basic 系です。
  2. メールアドレスのデシマルコードを入れておく変数を宣言。
  3. カーソル位置の文字が、半角スペース(文字コードは 16 進数で 20)より後の文字コードで、かつ、通常の英数半角文字の最後のコード(文字は ~ tilde で文字コードは 16 進数で 7e)までのものなら、ループ内の処理をする。
  4. カーソル上の文字のコード @Code の数値を文字列に変換し、その前後に必要な文字「&#」と「;」を足して 1 文字ぶんのデシマルコードを作り、これをすでにデシマルコードを入れてある変数のシッポに追加する。
  5. 次の文字に移動する。
  6. ループ範囲終わり。(カーソルが変換対象以外の文字にある)
  7. 文字ごとにデシマルコードに変換してつないだものを、カーソル位置に書き入れる。その前に半角スペースも挿入する。
  8. プロシージャ終わり。

同じことを秀丸エディタのマクロでやるとこうなります。プロシージャの始まりと終わりの行、および、変数の宣言がいりません。

$s = "";
while (code > 0x20 && code < 0x7f) {
    $s = $s + "&#" + str(code) + ";";
    right;
}
insert " " + $s;

掲示板 CGI の部品

上の結果と同じことを掲示板の投稿者のメールアドレスについても自動的に処理できます。うちの掲示板 CGI は KENT WEB の Sun Board の古いバージョンを改造したものですが、「メールアドレスの記入があった場合、これをメールアドレスのタグにする」という部分をこのように改造してあります。

# email をエンコード
if ($email) {
	$email = 'mailto:' . $email;
	$email = '&#' . join(';&#',unpack('C*', $email)) . ';';
	$name="<a href=\"$email\">$name</a>"
}

要するに unpack で文字をコード番号に戻しているだけです。わたしはこういうのは詳しくないので、参考書を見ながら試行錯誤で。

オンライン変換ツール

自分のメールアドレスだけちょこっとエンコードしたいかたは、こちらでどうぞ。「mailto:」部分が必要であれば、その部分もまとめて記入して変換します。

【 デシマルコード変換CGI 】

この CGI スクリプトはこちら。 ⇒ encode.zip

2004/02/15 - encode.cgi 修正。
2004/01/29 - スパム対策をメインに少し変更。

(2003/09/04 - 2004/02/15)