メールアドレスをスパム(迷惑メール)送信業者から守る方法

ホームページ上でメールアドレスを公開していると、毎日何百通とスパムメール(迷惑メール)が届きます。ウイルスメールは全てサーバ上で削除されるようにしているので、ウイルスメールがどれぐらい届いているかはわかりませんが、スパムメールは本当によく届きます。



| 「百害あって一利なし」のスパムメール | スパムメール送信業者はどうやってメールアドレスを集めている? |

| 対策1:メールアドレスを画像にする | 対策2:「@」(アットマーク)だけを全角文字にする |

| 対策3:数値参照文字を使い、「@」を「@」と表記する(HTMLエンティティ化のための変換プログラムあり) |

| 対策4:JavaScriptを使ってメールアドレスをエンコード(疑似暗号化)する(変換プログラムあり) |

| 対策5:専用ソフトを使ってHTMLソース全体を暗号化する |

| 対策6:メールアドレスの公開をやめる(CGIフォームを使う) | まとめ |


● 「百害あって一利なし」のスパムメール

これだけ多いと、スパムメールかそうでないかの判断に相当の時間を毎日費やされることになりますし、また、スパムメールでないものを間違って削除してしまう危険性もそれだけ増します。また、そのようなミスを犯してしまわないかと、非常に神経をすり減らす結果になります。そうして、迷惑メールの大半が出会い系サイトからの「やらせてあげますから」メールであり、間違って読んでしまうと非常に不快な内容ばかりです。

まさに、「百害あって一利なし」状態なのですが、このスパムメールの量を減らすにはどうしたらいいでしょうか? もちろん、ウイルスメールのようにサーバ上で自動判別して削除させる手もあるのですが、これは誤判定の可能性を考えるとなかなかできません。迷惑メールかどうか判別だけをさせて(Gmailの活用ウイルスバスター2006の活用などで。)、最終判断は人間がまとめてするという形が一番現実的だと思いますが、このやり方はスパムメールの絶対量を減らすことにはつながりません。これが欠点です。

ホームページ上にメールアドレスを公開しなければもっとも確実なのでしょうが、そうもいかない場合も多いです。そこで、いくつか迷惑メールをあまり受信しなくて済むメールアドレス公開法を考えていきたいと思います。

ページトップへ


● スパムメール送信業者はどうやってメールアドレスを集めている?

大前提として、スパムメールの送信業者というのは、そういう出会い系サイトのオーナーたちなのですが、彼らはメールアドレスのリストを購入しているわけです。では、そのようなリストを販売している人はどうやってメールアドレスを集めているかと言えば、ロボット(自動巡回プログラム)によって自動収集させているわけです。決して、生身の人間が、適当にネットで調べ物をしながら、メールアドレスらしきものを見つけたら、どんどこ、メモ帳やExcelなどに保存していくというような原始的方法は使っていません。少なくとも、そのようなやり方は主流ではありません。

サーチエンジンの自動巡回ロボットが毎日世界中のサイトを訪問し、その内容をデータベースに登録していっているのと同じように、このスパムメール送信用のメールアドレス収集部隊ともいうべき巡回ロボットが訪問してきているのです。このようなロボットは、HTMLソースを分析し、メールアドレスらしきもの(@があって、その前後に半角英数字が並ぶもの。)をどんどん記録していきます。

ですから、このロボットに読み取れないような形であれば、スパムメールの受信量は劇的に減る可能性があるといことになります。(ただし、人間にも読み取れない形にしますと、メールアドレスを公開していないと同じことになりますので、たまたまスパムメールの業者(人間)があなたのサイトを訪問し、メールアドレスを記録していく可能性はなくなりません。当たり前の話ですが、念のため。)

ページトップへ


● 対策1:メールアドレスを画像にする

のようにしておけば、一般的なレベルのロボットであればまず読み取れません。人間だけがメールアドレスを認識できますが、この欠点は、いざメールで問い合わせしようとした無実の第三社がタイプミスをしてしまって、メールアドレス間違いからメールを送信できないトラブルに巻き込まれる可能性があることです。

また、フォントによっては、「0」(ゼロ)と「O」(オー)、「1」(いち)と「l」(エル)の区別が難しい場合も十分にありえます。

しかし、だからといって、

<a href="mailto:info@broadband-xp.com"><img src="gazou.gif" width=186 height=63></a>と書いてしまえば、元の木阿弥です。

ページトップへ


● 対策2:「@」(アットマーク)だけを全角文字にする

「メールは、info@broadband-xp.comまで(@は半角に書き換えてください)。」のように、アットマークのみ全角文字にします。

例1:
たしかに、これであれば、半角の「@」をメールアドレス出現の目印として設計されているメールアドレス収集プログラムに対しては対抗できます。しかし、少し、プログラムを変えられて、全角のアットマークもメールアドレスとして認識されるようになれば、やっぱりスパムメールは大量に受信することになります。

また、サイト訪問者に@を書き換えさせるという作業をお願いしなければならないため、その点が難です。初心者だと何をお願いされているか分からない可能性があります。

ページトップへ


● 対策3:数値参照文字を使い、「@」を「&#64;」と表記する(HTMLエンティティ化)

HTMLソースの中で「メールは、info&#64;broadband-xp.com まで。」と書いておけば、「メールは、info@broadband-xp.com まで。」と表示されるようになり、メールを書きたい人はメールアドレスの部分だけをコピーできます(これが対策1の画像化との大きな違い)。また、コピーした後、ユーザーが文字列の一部を変更しなければならない作業も発生しません(対策2との違い)。

また、対策2の場合と同様に、「&#64;」がアットマークのことだということがプログラムの中に組み込まれてしまえば、メールアドレスを収集される危険性はなくなりません。これが欠点です。では、@以外の英数字も全て数値参照文字にしてしまった場合を考えてみましょう。

例2:
のようなHTMLソースにするということです。
このソースを実際にHTMLソースに貼り付けますと、下記のようになります。

info@broadband-xp.com

実際にリンクをクリックしていただけば、正しく動作していていることを確認していただけるはずです。

ても、下記のような変換テーブルは簡単に作れるため、比較的突破されやすいです。

45-55765A75K85U95_105i115s
46.56866B76L86V96`106j116t
47/57967C77M87W97a107k117u
48058:68D78N88X98b108l118v
49159;69E79O89Y99c109m119w
50260<70F80P90Z100d110n120x
51361=71G81Q45-101e111o121y
52462>72H82R92\102f112p122z
53563?73I83S93]103g113q123{
54664@74J84T94^104h114r124|

ただ、この数値参照文字方式(所謂「HTMLエンティティ化」)でも十分効果があると思われる方は、下記の変換プログラムを使ってメールアドレスを変換してみると良いでしょう。

ページトップへ


メールアドレス

 ex. 「info@broadband-xp.com」などメールアドレスだけを入力してください。


変換結果:

ページトップへ



● 対策4:JavaScriptを使ってメールアドレスをエンコード(疑似暗号化)する

対策3の数値文字参照を使うやり方と原理は一緒ですが、メールアドレスに使われている英数字をASCII値に変換します。それをString.fromCharCode()を使って、元の英数字からなるメールアドレスに戻します。後は、document.writeでメールアドレス部分を出力すればいいのですが、「mailto:」などのキーワードを使ってメールアドレスらしきものを検索されたりすると困りますので、一応分割してあります。
例3:
▼ 例3のJavaScriptを実際にソースに貼り付けた例


ここにある、上記の変換テーブルを見ても分かりますように、「105」という数字は結局は「i」のことであり、「110」という数字は、「n」のことです。この変換テーブルは全世界共通のため、見破られやすいということであれば、二通りの対策があるかと思います。

まず、「var em=String.fromCharCode(105,110,102,111,64,98,114,111,97,100)+String.fromCharCode(98,97,110,100,45,120,112,46,99,111,109);」の部分は単純に外部ファイル化する(JSファイル化)ことも対策になります。

また、「104」という数字を与えられたら、1を足して、「105」という数字に対応する文字をdocument.writeするように、1個ずつずれるように変換するというような単純な変換でも、十分な対策になります。サンプルは下記のようになります。

例4:
▼ 例4のJavaScriptを実際にソースに貼り付けた例


単純に、上記ソースの中の「String.fromCharCode(104,109,101,110,63,97,113,110,96,99)+String.fromCharCode(97,96,109,99,44,119,111,45,98,110,108);」しか見ていないと、「hmen?aqn`ca`mc,wo-bnl」という文字列にしか変換できません。これが1個ずつ、ASCII値がずれてはじめて、「info@broadband-xp.com」となるという訳です。もちろん、全部1個ずつずらすという単純なルールではなくて、もっと複雑にすることも可能でしょう。例えば、前から数えて何文字目かで判断して、3で割り切れる場合は1個ずれるけれど、それ以外の場合は3個ASCII値がずれるようにするとか、いろいろできるはずです。

 LinuxのブラウザであるKonqueror(ユーザーシェア0.1%未満)には、JavaScriptに重大なバグがあり、Shift_JISのページでエスケープ文字の「\」(バックスラッシュ)が利用されていると、エスケープ文字として解釈されないために、不具合が発生します。そのため、Konquerorのことを考えるのであれば、「\」が出現しないで済むように、ダブル・クォートとシングル・クォートをうまく使わなければなりません。(参照:Konquerorとエスケープ文字(JavaScript謎のエラーを解く)

具体的には、例4サンプルの
document.write("メールは、<a href=\"mai"+"lto:"+em+"\">"+em+"</a> まで。");
の部分を
document.write('メールは、<a href="mai'+'lto:'+em+'">'+em+'</a> まで。');
とします。


▼ 例4のJavaScriptをKonqueror向けに修正したものを、実際にHTMLソースとして貼り付けた例


いずれにせよ、メールアドレスから、例4のようなJavaScriptを作成するのは、それほど簡単ではありません。そこで、簡単にソースを作成できますようにしたものが、下記です。メールアドレスを入力していただき、「変換ボタン」をクリックするだけです。JavaScriptで変換しているだけですから、弊社サーバには一切の情報は送信されません。ご安心ください。

メールアドレス

 ex. 「info@broadband-xp.com」などメールアドレスだけを入力してください。

 LinuxのブラウザKonquerorのバグ対策を考慮する。(推奨。詳細


変換結果:



(ご注意)Macユーザーの方で、テキストエディターにJedit Xをご利用の皆様
ただし、この「対策4」には重大な欠陥があります。お気づきの人も多いでしょうが、このままでは、JavaScriptをoffにされているユーザーには、何も表示されないのです。かといって、

と真っ正直に書いていたら、最初から対策していないのと同じです。

では、どうすればいいかといいますと、JavaScriptをoffにしている人に対しては、あまり良い解法とは言えないと思われていた対策1を使うようにしますます。すなわち、

例5:
のようにして、「mailto.gif」の中にメールアドレスを書いておくようにします。フォントによっては、「0」(ゼロ)と「O」(オー)、「1」(いち)と「l」(エル)の区別が難しい場合もやはり出てきますが、対策1と違って、全ての人にその判読が簡単でないメールアドレスを読ませるのではなく、約3%ほどの人だけがそういう不自由な環境を強いられることになる点が違います。圧倒的大多数(約97%ほど)の方はJavaScriptをonにされていて、問題がないため、妥協できるレベルではないでしょうか?

なお、対策3の数値参照文字を使う場合(HTMLエンティティ化)も、対策4のJavaScriptを使う場合も、どのブラウザ・どのメールソフトでも大丈夫なのか心配なところだと思いますが、テストした限りでは、動作しないメールソフトはありませんでした。)



<<動作確認済みブラウザ及びメールソフト一覧(対策3及び対策4)>>
数が多くなってきたので別ページにまとめました。参照:メールソフトのシェア(各種調査リンク集)

ページトップへ


● 対策5:専用ソフトを使ってHTMLソース全体を暗号化する

サンプル3もしくはサンプル4の場合はメールアドレスだけを暗号化しましたが、HTMLソース暗号化ソフト「SHTML」を使えば、メールアドレスだけでなくHTMLソース全体を暗号化できるため、ロボットによるメールアドレス収集に対して、強力に対抗できます。

ただし、単にスパムメール対策のためだけに、HTMLソース全体を暗号化してしまうと、SEOの観点やメンテナンスの簡便性の観点からデメリットが大きすぎますね。画像の保護や、コンテンツを印刷されたくない、コピーされたくないという目的であれば、ついでにスパム対策にもなるHTMLソースの暗号化はお勧めですが、そうでない場合は避けるべきだと思います。

ページトップへ


● 対策6:メールアドレスの公開をやめる(CGIフォームを使う)

当たり前と言えば当たり前ですが、メールアドレスをホームページ上に公開しなければ、スパムメールの餌食になる可能性は激減します。問合わせメールはmailtoタグでメールを送ってもらうのではなくて、CGI経由で送ってもらいます。これであれば、送り先のメールアドレスを公開する必要がありません。

CGI経由で受け取ったメールに対して返信すれば、差出人のメールアドレスは受信者に分かってしまいますが、スパムメール業者がそこまで面倒なことをするのは稀と思われ、CGIフォームはかなり有効であると思われます。

なお、たまに、問合わせメールの差出人メールアドレスを「送信専用メールアドレス」と称して、「返信いただいてもお答えできません。問い合わせは、ご面倒でもWEBフォーム上から再度お願いします。」などとして、リファレンス番号さえメールにつけずに送ってくる会社がたまにいますが、これはユーザービリティーの観点から最低と思われます。やりすぎです。ここまでやるのはやめましょう。

ページトップへ


● まとめ


対策方法導入までの
簡便性
導入
効果
エンドユーザー
への配慮
備考
メールアドレスを画像にする×ユーザーは画像にある文字を読み取らなければならず、見分けが難しい文字(「1」(数字の1)と「l」(小文字のエル)、「0」(数字の0)と「O」(アルファベットのオー))などが特に問題。

また、画像を準備するのが多少面倒。
「@」(アットマーク)だけを全角文字にするユーザーの方でコピー&ペーストして、全角の「@」を半角「@」に書き換える作業が必要であり、面倒です。ユーザーのレベルによっては、「全角」と「半角」の意味を理解できないというケースもあるように思われます。

また、スパムメール用メールアドレスを収集している業者が「対策する」(=全角の「@」をメールアドレスとして認識するようにプログラムを変更すること。)のはかなり容易です。
数値参照文字を使い、「@」を「&#64;」と表記する
(HTMLエンティティ化)
英数字を数値参照文字に変換する作業が面倒ですが、当ページのプログラムを使えば、非常に簡単に変換できます。また、JavaScriptをoffにしているユーザーに対しても利用可能なため、一番のお勧めです。
JavaScriptを使ってメールアドレスをエンコード(疑似暗号化)する×自力でやるのは結構骨が折れるかと思いますが、当ページのプログラムを使えば、非常に簡単に変換できます。ただし、JavaScriptをoffにしているユーザーに対してもは、別途画像による案内などをやらなければならないため、かなり面倒であると同時に、JavaScriptをoffにしているエンドユーザーに対しては一定の不便を強いることになります。
専用ソフトを使ってHTMLソース全体を暗号化する×機械的にメールアドレスを収集するメールアドレス販売業者などのロボットからの攻撃に対しては最大の効果をもたらすはずですが、JavaScriptをoffにしているエンドユーザーに対しては一定の不便を強いることになります。

また、ページの一部でも変更しようと思うと、その都度、暗号化作業もやりなおさなければならないため、メンテナンス性には欠けます。
CGIフォームを使う× プロバイダやレンタルサーバ事業者提供のCGIなどが利用できる場合はいいですが、そうでない場合には、初心者が導入するにはハードルがあります。

mailtoの時と違って、ユーザーが入力したメールの内容は「送信済みアイテム」などには残りませんので、ユーザーが送信したメールのコピーをユーザー自身にも送ってあげると親切です。(WEBフォーム上のテキストエリアに入力した情報をメモ帳などで別途保存する作業を毎回しているユーザーは恐らく稀です。)

しかしながら、スパムメール送信用のメールアドレスを収集しているロボットに見つかる可能性は極めて低くなりますし、また、CGIフォームの場合、メールのサブジェクト(件名)を完全に固定化できるため、情報管理にも適しています。

 mailtoであらかじめサブジェクトを設定しておくことも可能ですが(<a href="mailto:info@broadband-xp.com?subject=メールアドレスをスパムメールから守る方法">メール</a>とすれば、多くのメールソフトで、件名として「メールアドレスをスパムメールから守る方法」がぷリセットされます。)、ユーザーが変更することも可能であったり、ページの文字コードがShift_JIS以外の場合にひと工夫必要です。EUC-JPのページで、そのまま日本語の文字コードを引数に渡しても文字化けするために、URLエンコードしたりする必要があります。(参照:EUCのページでmailtoのサブジェクトを指定するには?)。また、Shift_JISのページであっても、一部のメールソフト(メールクライアント)では文字化けします。やはり、サブジェクトを固定化したい場合には、CGIでのサブジェクト固定が賢明です。

ページトップへ



← 「HTMLソースを隠す方法」に戻る