2004年8月23日 Perl もう一歩前進! スパムメール撃退編

今日は、4月に書いたPerl 一歩前進!の続きです。 このシリーズは「意思あるところに道は通ず」をテーマに、前向きで行こうと思います。

‥って書くとカッコイイけど、正確には「意思あるところ」というよりは「必要あるところ」かな?? いつだってステップアップのきっかけは「必要に迫られて」であり、 必要のないところには意思もなく、したがって道も開けない。 ‥なんか情けない気もしますが、まあいいや。 早速本題に入りたいと思います。 今日は「スパムメールの撃退法」であります。

実は最近、「掲示板にメールアドレスを書き込んだら、スパムメールがきた」という 報告が相次いでいたんですよね。 それで、なんとかしたいなあと思っていました。 掲示板に書き込んでくださった方々のメールアドレスをメール収集ロボットの魔の手から守る方法はないかな、と。

迷惑メール全般をスパムメールと呼びますが、その中でも厄介なのが、メール収集ロボットが ウェブ上で収集したメールアドレスに対し、無差別に送りつけてくるものです。 一方的な企業広告やアダルトサイトへの勧誘など、ただ不愉快なだけのものもあれば、 そのメールを開いただけでパソコンに大きな打撃を与えるものもあります。

それでも、自分に送りつけてこられるのはまだマシ。 身に覚えのないメールは開かずにゴミ箱行きにすることで、ある程度防衛できますから。

もっと怖いのは、自分のメールアドレスが送信元として使われたときです。 メールアドレスを偽って迷惑メールをばらまくという恐ろしいスパムもあり、 その発信元としてメールアドレスを使われた人は、ウィルスを撒き散らしたという、 とんでもない冤罪を背負い込むことになります。

掲示板にメールアドレスを書き込むことには、こうしたリスクがあります。 その一方で、利点もあります。
「掲示板に書いてメールアドレスを記しておいたおかげで、誰それからメールで良い情報をいただきました」 といった嬉しいご報告をよく頂きます。 メールアドレスの公開はインターネット上で見ず知らずの人同士を結びつける貴重な手段になりうるわけです。 なので当サイトの掲示板では、メールアドレスを公開するかしないかは個人の判断に任せ、任意としています。

ところで、「メールアドレスの公開」とはどのようなことを指しているのでしょうか。
「メールアドレスが人の目にさらされること?」 ――いいえ、厳密に言うと、それは違います。 メールアドレスへのリンクが貼ってあれば、目に見えなくても、公開したことになります。 むしろ、ただ単純にメールアドレスを見える形で書くよりも、 メーラーへのリンクの形でメールアドレスを記載するほうがはるかにリスクが高い。 メール収集ロボットの目につきやすいからです。 たとえば、

メールのあて先:kiriusan@hoge.co.jp

と書くより、

メールのあて先はコチラ

と書くほうがはるかにメール収集ロボットの目につきやすく、したがってリスクも高いのです。 なぜなら、ロボットはブラウザに表示される文字を読むのではなく、ソースを読むのであり、 リンクに記載されている文字列はメールアドレスであることが明白だからです。 実際、上のような書き方で書いてあるわたしのメールアドレスには滅多にスパムメールは来ませんが、 かつて下のような書き方で公開していた別のメールアドレスには、いまだに毎日山ほどスパムメールがきます。

尤も、上のように書いてあるアドレスには更にメール収集ロボット対策を講じてあり、 ソース上では、

kiri<!--hogehoge-->usan@hoge.co.jp

のように書いてあります。メールアドレスの記述にコメントを挟んであるのです。 <!--hogehoge-->の部分はコメントといって、 ブラウザが表示するときには無視する決まりになっています。 そのままドラッグしてあて先欄に貼り付けることも可能です。 でもロボットはコメント部分もメールアドレスの一部として判断します。 こうした防御がかかっていることもあって、このメールアドレスは難を免れてきたのでしょう。

でも残念ながら、メーラーへのリンクを貼る場合には、この「コメントを挟む」という手が使えません。 そこが頭の痛いところでした。

ところが先日、ついに見つけたんですねえ、メーラーにリンクを貼る形でも メール収集ロボットの目が欺ける方法を。
それは、メールアドレスの一部または全部を、文字参照で書くことです。 「文字参照」 というのは、ウェブサイトに書かれる文字を、文字コードの形でソースに記述する書き方です。 通常、HTMLのマークアップに使われるタグ記号などの記述に使われます。

たとえば我が家のサイトでは 「<<<」とか「>>>」などといったマークを リンク部分によく使っています。 このページの上のほうや下のほうにも使われていると思います。 でもソースを開いてごらんになるとお分かりだとおもいますが、 実際にはこのマークは「&lt;&lt;&lt;」、 「&gt;&gt;&gt;」 といった文字コードで記述されています。 なぜわざわざそんな書き方をするかというと、「<」や「>」 といった文字はHTMLの制御記号であるタグの開始と終了に使われる記号であり、 文字として使用することにより、ブラウザに混乱を来たすおそれがあるからです。

また、マイナー言語の文字や、特殊な記号など、文字参照でしか画面に呼び出せない文字もあります。
たとえば「」。 この記号はキーボードから打ち込むことができません(Windowsの場合)。 なので、文字参照で「&hearts;」と書くことにより、表示させます。

ちょっぴり脇道にそれましたが、 それでは「文字参照でメールアドレスを書く方法」を具体的にご紹介しましょう。 まずメールアドレスの中で最も目につきやすいのは@であり、 メール収集ロボットはメーラーへのリンクである"mailto:"という文字列と@を目印に ソースの中からメールアドレスを探し出すと思われますので、 まずは「@」を文字参照で書いてみます。 「&#64;」と書きます。

こう書いてもブラウザのほうは、「ああこれは"@"のことだな」と理解して処理してくれます。 試しに、メーラーがちゃんと認識しているかどうか、試してみましょう。 以下は、文字参照を使って書いたリンクです。 ステータスバーを表示し、リンク部分をマウスでポイントし、 そのあとリンク部分をクリックしてみてください。

お便りはこちら

――ねっ? ステータスバーも、メーラーのあて先欄も、ちゃんと@になっているでしょう? 人間が使用する際には面倒がなく、スパムロボットの目だけ欺けるのだから、すばらしい!

とはいうものの、実はこの方法、わたしが発見したんじゃないんですよね。 たまたま通りかかったサイトで発見したのです。 なので、この方法自体は、他サイトからのただの受け売りです。 しかも、これはいいことを知ったと嬉しくなってみんなに教えてあげようと思い、 お気に入りの上のほうからクリックしたら、 しょっぱなからすでにこの方法を採用しているサイトにあたってガックリ。 それほどものすごいレア情報でもないみたい。

でも、ここからがうさぎの意地の見せ所。 掲示板に書き込まれたメールアドレスの「@」を 文字コード「&#64;」に自動的に置き換える式をPerlで書いてみました。

$mail =~ s/\@/&\#64;/g;

これで$mailという変数の中に入った「abcd@efgh.ne.jp」という文字列が、 「abcd&#64;efgh.ne.jp」に置き換えられます。 ついでにもう一種類の文字を変えて、目くらましを強化してみましょう。

$mail =~ s/\./&\#46;/g;

これで$mailという変数の中に入った「abcd&#64;efgh.ne.jp」という文字列が更に 「abcd&#64;efgh&#46;ne&#46;jp」と置き換えられました。

さて、これをCGIソースの一体どこに埋め込むかですが、 まずは、CGIソースを開き、「mailto:」で検索をかけます。 すると、

$name = "<a href=\"mailto:$email\">$name</a>";

などといった記述が何箇所か出てきますので、それを目印に その直前で、mailto:の後に書かれている変数(ここでは$email)に変換を掛けます。

$email =~ s/\@/&\#64;/g; $email =~ s/\./&\#46;/g;

というように。
たとえば Kent Webの一番人気YY-Boardの最新バージョン(2004年8月現在)の場合、 yybbs.cgiを折り返しなしで表示すると、96行目に

if ($eml) { $nam = "<a href=\"mailto:$eml\">$nam</a>"; }

という式が現れますので、これを

if ($eml) { $eml =~ s/\@/&\#64;/g; $eml =~ s/\./&\#46;/g; $nam = "<a href=\"mailto:$eml \">$nam</a>"; }

のように書き換えます(途中改行無用・コピペ可能)。 これはメインの表示処理の一部分で、 他にも似たような修正箇所はありますが、 ワード検索モード時や過去ログ、記事修正時の表示なので緊急度は低く、 直しても直さなくても‥という感じです。

‥なんて書きましたが、これはあくまでも「改造のヒント」程度と受け取ってください。 同じYY-boardでもバージョンが違っただけで変数名や修正箇所が違いますし、 CGIはセミコロンの位置一つ間違えても動かなくなりますので、 改造を実践される場合はくれぐれもバックアップをお忘れなく。 このCGI改造により万一不利益を被られましても、当方では責任を負いかねます。あしからず。 他のアルファベットを文字参照で書きたい場合は、 アルファベットと数字の数値実体参照一覧(All About Japan) を参照されるとよいでしょう。

最後にもう一つ、htmlページでメールアドレスを守る方法をば。
htmlページに管理人のアドレスを埋め込む場合、 文字参照だけでは手ぬるいとお考えでしたら、 アドレス表示処理をJavaScriptの外部ファイルに丸投げする方法があります (但し、閲覧者がJavaScriptをオフにしている場合、アドレスは表示されません)。

まず、htmlソースの中でアドレスを表示したい部分に

<script src="○○.js" type="text/javascript"></script>

と書き込みます。 次に、そのhtmlファイルと同じフォルダでメモ帳を開き、

document.write("<a href='mailto:あなたのメールアドレス'>あなたのメールアドレス</a><br>");

と書き込んで(途中改行無用・コピペ可能)、○○.jsという名前をつけます。 ○○の部分にはお好きな名前をどうぞ(但しアルファベット)。

今回は3種類のロボットよけメールアドレス記載方法をご紹介しました。

  1. コメントを挟む方法
  2. 文字参照で記述する方法
  3. 外部JavaScriptに記載する方法

残念ながらこれらの方法はどれも、100%の防御策ではありません。 それでも今のところは、かなり効果があるようです。 でも、将来的には分かりません。 害虫に耐性ができて以前は効果的だった殺虫剤が効かなくなることがあるように、 こちらが防御策をとれば、その防御の網の目をかいくぐるスパムもそのうち現れる。 いたちごっこです。

なのでこうした現状を踏まえ、 ちゃあのデジカメ日記掲示板に関しては、 小・中学生が集う場であることを考慮し、 思い切ってメール記載欄をなくしてしまいました。 記載欄がなければ書き込むことができないので、安全といえば安全です。

でも寂しいですね。 ごく一部の不埒者のために、メリットを生むチャンスを捨て、なぜここまでしなくてはならないのか。 本当に腹立たしい思いです。

8月27日追記:

文字参照応用編

考えてみたら、@よりも、mailto:を文字参照で偽装するほうが、より安全なのではないかという気がして、 試してみました。 なぜって、スーパマーの側からすれば、 mailtoのあとがどんな文字列であれ、mailtoでリンクを貼ってあるものは すべてメールアドレスとして拾っていっても、ソンはないからです。

この方法は、今日わたしが編み出したばかり、大変レアなやり方(ひょっとしたらネット初かも♪)なので、 このページをスパマーが読まない限り、安全‥かも??*1 ただ、あまりにもレアすぎて、テストが充分でないのが玉にキズ。 なので、みなさんにテストをお手伝いいただけたらな、と思っています。 下記のリンクをクリックしてみてください。mailto:に到るまで、引数以外すべて文字参照で書いてあります。

お便りは きりんとうさぎ まで!

いかがですか? メーラーはちゃんと立ち上がりましたか?
IE6.0 for Windowsでは正常に動作すること/を確認しましたが、 IE 旧バージョン、IE for Macネスケサファリ、オペラなどでは未確認です*2。 それらのブラウザをご使用の方、テストにご協力いただけると助かります。

上記リンクをクリックし、ブラウザの種類、バージョンをお書き添えの上、 テストメールをください。 わたしから返信が帰ってくればテスト成功、メールサーバーからfailer noticeが届けば失敗、 ブラウザの実装が充分でないということになります。よろしくお願いいたします。 みんなでスパムメールを撃退しよう!!

ちなみに、文字参照への変換は 数値文字参照変換スクリプト にて行いました。 これ、とっても便利です。 コードの記述が10進と16進から選べるようになっていますが、10進コード推奨です。 16進コードはネスケやIEの旧バージョンではサポートされていないようですので。 (ただし、16進コードのほうがマイナーなので、安全性は高いかも〜??)
文字参照にはほかに文字実体参照がありますが、こちらも、文字によってはブラウザの実装度が低いようです。

脚注: *1 ネット既出だったようです。がっかり〜。 メールアドレスの保護(自宅サーバーWebRing)

*2 ブラウザ実装確認状況
日付 ブラウザの種類とバージョン 動作 協力者
09/12 Opera for PHS AH-K3001V 数値参照部分は正常
(但しsubject部分が一部文字化け)
ねむりにゃんこさん
08/29 Netscape ver7.0 正常 あかねさん
08/28 Donut RAPT #51 正常 MACKYさん
08/27 IE for Mac ver.5.2.3 正常 はまこさん
08/27 Safari ver.1.2.3 正常 はまこさん
08/27 Firefox ver.0.9.3 正常 minatsuさん
08/27 Internet Explorer ver.6.028 正常  

「BBSの番人」配布編→

←お子様のご要望にお応えする編