>>スパム対策(その1)【2007/01/20(土)】[Web関連]スパムっていやですよね。siteの関係からメールアドレスを公開しているのですが、最近はスパムが増え続け、一日に送られてくるスパムが3桁の大台に乗るのも間近となりました。ある程度は仕方ないとは思っていたものの、ここまで増えると処理も大変です。メーラーにフィルターを設けて選別していますが、時に問い合わせのメールまでスパムと判定されたりすることもあるので、結局自分でチェックしなければなりません。自分の目で確かめてもスパムかどうか判断に悩むものも時にはあります。これ以上スパムが増えると様々な支障をきたすのは明白です。そこで、遅まきながら対策に乗り出すことにしました。siteからメールアドレスらしきものを収集しています。googleの検索情報収集のシステムもクローラーの一種で、ボットなどと言われています。仮にメールアドレス収集用のクローラーが限定されているのなら、サイトに制限を設けてアクセスできないようにすることも可能ですが、様々なIPアドレスから様々な偽装工作をしてやってくるクローラーに完全に対処することは殆ど不可能です。制限を厳しくしていけば、google等の検索エンジンも弾いてしまうことになりかねません。siteに記載されたメールアドレスを収集し難いものにする、という対策に落ち着くようです。Netで調べてみたところ、やはり皆さん色々と苦労されているようでして、対策も様々ですね。href="mailto:〜〜@〜〜">」というタグや@(アットマーク)の前後の文字列をメールアドレスと見なしているわけですから、そのあたりを何とかすれば良いことになります。比較的多いのが、アドレスをテキストではなく下記のようにイメージにしてしまうものです。siteでは不向きといえます。最近ではOCR技術の発展で画像からテキストを読み出す事も出来るクローラーがあるようですから、万全とは言え難くなっているようです。その2:【アドレスの文字を一部変更、追加する】これも比較的多いパターンです。@(半角)を@(全角)に変えてみたり、#などにしてabc-def#zyx.ab.jp(#を@に変えてください)としたり、abc-def@no-spamzyx.ab.jp(no-spamを取り除いてください)とするようなものです。これもアクセシビリティの点では今ひとつですし、自動的にno-spam等の怪しい文字列を取り除いたりするクローラーも有るとのことですから、対処法としてはあまりお勧めできないようですが、何もしないよりはマシだと言えます。その3:【テーブルタグの利用】これは<table></table>タグなどのブロックタグを利用してアドレスを分割するものです。@のように表示されます。これをコピーすると間に余分なスペースが入ったり、上記の例では前後に@が入ったりすることがあるので但し書きが必要になります。アクセシビリティの面からはあまりお勧めは出来ませんね。効果の方はどうなのでしょう?タグを取り除いてしまえばそのままのアドレスを取得できてしまいますので、万全とは言えないかもしれませんが、上記の例のように文字列間に通常は表示されない形で適当な言葉を挟んでおく事である程度は対処できそうに思います。その4:【アドレスをエンティティ(数値文字実体参照)化する】その2のパターンに近いものですが、@マークなどを表示用特殊文字に変換して(エンティティ化)、ブラウザでは正常に見えても、ソースは別のものに見えるようにする方法です。@は数値文字実体参照では「&#64;」になりますので、abc-def&#64;zyx.ab.jpとすれば、abc-def@zyx.ab.jpのように表示されるわけです。href="mailto:〜〜〜">タグでも使用できますのでアクセシビリティの面では合格といえます。最近はエンティティ化したものに対処する為、@のほかに「&#64;」を検索対象に入れるものが増えてきてるということですから、効果は低いと言わざるを得ないようです。他の文字列までエンティティ化したとしても対応表を用いて変換されてしまえば同じ事ですので。siteなどに「お問い合わせのお客様は下記送信フォームよりお願い致します」などとあるもので、cgiのsendmailを利用し専用問い合わせフォームからのみメールを受け付けると言うものです。メールアドレスが表に出る事はありませんし、フォームが使えないブラウザというものはありませんから、アクセシビリティに配慮した上である意味究極のスパム対策とも言えるかもしれません。これにもいくつか問題点があります。一つはだれでも簡単に設置することが出来るわけではないというものです。サーバー内で自由にcgiを動かせる環境であるならばフリーのフォームメールcgiを設置したり、perlが書ける人ならば比較的簡単に自作も出来ますが、cgiが使えなかったりスパムの温床となることを防ぐためにsendmailを利用できないようになっているレンタルサーバーもありますので汎用性があるとは言えません。フォームメールのサービスを行っているところもあるようですので、それを利用するのも一つの手ではありますが、信用できるところでないと逆にメールアドレスを収集されてしまう可能性もありますので注意が必要となってきます。siteにアクセスしなければならない事を意味し不便とも言えます。このあたりは送信フォームにメールアドレスを記載してもらうことにより、返信メールに実アドレスを載せれば対処できますが、記載されていたアドレスに不備があった場合などは連絡がつかなくなることも予想されるので、いらぬトラブルの元となる可能性は否めません。これを防ぐには送信フォームを利用した際に自動的に投稿者のアドレスへメールを送信し、そこに記載されたワンタイムパスワードを設置したアドレスにアクセスしてもらう、というパターンも考えられます。ここまでやると、正直やりすぎといった感がありますよねえ・・・。送信フォームが匿名であることから嫌がらせをされる可能性というのも考えられますが、連続投稿を許可しないなど、このへんはcgiの方で規制を掛けることも出来ますのでさほど心配は要らないかもしれません。scriptを用いてメールアドレスを表示するものです。--></script>というスクリプトをあらかじめhtmlファイルに書いておき、次のようにすればアドレスが表示されます。scriptを有効にしてください。scriptが無効になっている場合は表示されませんし、携帯からのアクセスでは見ることが出来ません。アクセシビリティの面では一部配慮に欠けると言えるかも知れません。scriptを解析するクローラーも出てきたとのことですから、いつまで効果を発揮するか分りません。scriptを用いてアドレスを表示することにしました。実際には外部に.jsファイル(例えばemail.js)を作成し、必要な場所で呼び出す形になります。"+mail.link(mail3+mail2));という記述をしておき、メールアドレスを表示したい場所に次のように書き込みます。src="./email.js></script>へお願いします。scriptに対応していないものは殆どありませんが、無効になっていたり携帯からアクセスした場合はアドレスを見ることができません。scriptが無効の場合はそのファイルへのリンクを表示する形式としました。.jsファイルのtry〜の記述は、スクリプトが有効ならid="adrs"で記述されたaddress.htmlへのリンクを表示させない為のものです。それにしても、ほんとにスパム対策は大変です。えらく儲かるのか知りませんがスパム業者の執念はすさまじいものですからどのみちイタチゴッコの様子を呈するのは間違いないと思いますけど、何とかならんものですかねえ・・・。siteのhtmlファイルは対策を施した事になるのですが、これだけでは不十分です。siteに設置してある掲示板はアドレスを表記できるものですから、そちらも対処しなくてはなりません。▽Gojuの特製ハンバーガ。