spam対策:Webでのメールアドレス表示
要件
Web 上にメールアドレスを書いても spam が来ないようにしたい。
問題
spam の宛先にするために、Webクローラによりメールアドレス収集が行われている。
このため、普通のテキストで foo@example.com などと書いたり、mailto:foo@example.com とURIとして書いたりすると、それが収集されて、spam の宛先とされてしまう。
対策
人間には読めるが、Webクローラでは収集できない形でメールアドレスを表示する。
Webクローラは "ユーザー名@ドメイン名" となる形式のものを文字列検索しているので、それ以外の方式で表示できればよい。
具体的な方法
メールアドレスをHTML上でバラバラの要素にする。見えない文字列を追加してメールアドレスとは明確に違う形式にする。
code:sample1.html
<style>
.hide { display: none; }
</style>
...
foo<span class="hide">&nbsp;</span>@<span class="hide">&nbsp;</span>example.com
CSS の埋め込みが必要。
CSS を切る、または変更すると表示が壊れる。コピーペーストしても余計な文字が入る。
どう分解するか、また、どういう文字列を追加するかにはバリエーションがある。
直接 style="display: none;" を入れてもいいかもしれない。レンダリング後に文字列検索するタイプの Web クローラだとダメかもしれない。
URI mailto: では使えない。
メールアドレスの一部または全部をエスケープ(HTML エンティティ、URLエンコーディング)する。
mailto:foo&#64;example.com
foo&#64;example.com
デコード、レンダリング後に文字列検索するタイプの Web クローラだとダメかもしれない。
もしもHTMLエンティティを正しく解釈しないのであれば、1文字変えておけば十分である。
メールアドレスに見えない文字(幅0の空白。"&#8203;")を入れる。
コピーペーストしたときに、見えない文字が入るために、「なぜか送信できない」という現象を引き起こす。
charset が Unicode でなければ正しく出力されない可能性がある。
URI mailto: では使えない。
JavaScript で後からメールアドレスを追加する。
Web クローラは JavaScript によるドキュメント改変まではまず検出しない。
URI mailto: でも使える。
JavaScript の埋め込みが必要。
JavaScript を切ると表示できなくなる。
メールアドレスの一部を別の文字にして、閲覧者に手で書き換えてもらう。
例: foo★example.com ←★を@に置き直してください。
例: foo [at] example.com
非常に不格好
最も簡単だが、spam対策の意味が分からない人に伝わらない。
URI mailto: では使えない。
メールアドレスを画像にする。
コピーペーストできない。(致命的)
個人の Web ではよいが、企業の Web では難しい。
URI mailto: では使えない。
メールアドレスを表示するための別ページに誘導する。
別ページでは CAPTCHA などの bot 判定プログラムを通してからメールアドレスを表示する。
大袈裟なので印象が良くないかもしれない。
大量に嘘アドレスを生成させる。
嘘かホントか分からないアドレスを大量生産するサイトで消耗させれば Web クローラの対象から外される可能性がある。
他のまっとうな Web クローラが被害に遭う。
懸念について
span などで書いたものでも頑張れば解析できてしまうのでは? (パターン認識や画像認識などで破られるのでは?)
そもそも、spam発信者は対策が緩いメールアドレスを優先的に収集しているため、少し対策をするだけで十分である。
Web クローラの作り方に強く依存する。レンダリング後にメールアドレスが「正しい」文字列になっている場合はスクレイピングをきっちりやっている Web クローラには通用しない可能性がある。(これを気にするならば mailto は使うことは不可能となる。)
視覚障害を持つ人がメールアドレスを読み取れない。