スパムメールの対策

フォームからの問い合わせを受け付けているとスパムが多く届く。数が多いと削除する手間と時間がけっこうかかるので何かしらの対応をしようと思い、対策を調べたのでメモ。リンク先にmailtoというのではなく、フォームからの受付を対象にした対策。

まずは直接的な対策から。スパム自体を送信できなくする、サーバー側ではじく方法を紹介。

hidden要素を追加する
<input type="hidden" name="mail" value="あいうえお">
<input type="hidden" name="address" value=""> 

フォームの内容とは直接関係ないinputタグを入れておき、botによる改変があったかを調べるやり方。mailにあいうえお以外が入力されていたらスパムと判定する。また、addressに変な文字が入っていればそれもスパムと判定。
※上記は例なのでname、value属性の値は適宜変更

◎メリット
サーバー問わず対策できる
閲覧者に負担がない

◎デメリット
hiddenのinput要素に変更を加えないbotの送信は防止できない

スパム対策第2弾

画像認証をする

画像を生成して、そこに表示された文字を入力してもらう。いろんなサービスで取り入れられてるのでよく見る。でも文字が判別しづらくて困ることがあるからあまり親切じゃないかも。

◎メリット
目視での確認が必要なのでスパム対策に効果あり

◎デメリット
表示される文字が読みにくい、入力作業が手間
サーバーに画像を扱うライブラリが入っていないと使えない

Securimage PHP Captcha

postされたデータをもとに判定する

サーバに送られてきたデータを見て判定する。スパムっぽいかどうかの判断が難しいので、特定の文字が入ってたら通すというようにホワイトリストで対応するのがよさそう。

◎メリット
サーバー問わず対策できる
閲覧者に負担がない

◎デメリット
ブラックリストで運用するとスパムの種類が多いのでどこを基準にスパムと判定するかが難しい(URLあり/なし、英字のみ、スパムっぽいメルアド)

メルアドを画像にして表示する

メルアドを画像にして表示。ユーザーに手入力してもらう(フォームなのに送信先を入力させるというのはどうかと思うけど)

◎メリット
目視での確認が必要なのでスパム対策に効果あり
サーバー問わず対策できる

◎デメリット
打ち間違え、入力作業が手間

フォームをjsで表示する

フォームに関する要素をjsで表示する。jsを実行できなければ送信できないので普通にブラウザからアクセスしてるなら問題なく動く。

document.write('<form action="http://zapanet.info/blog/?page='+'message" method="POST">');
var web="1";
document.write('<input type="hidden" name="web" value="'+web+'"> ');

◎メリット
サーバー問わず対策できる
閲覧者に負担がない

◎デメリット
jsを実行できないと送信できない。
jsを実行するボットには効果がない

メッセージフォーム設置&スパム対策第3弾

以下は間接的な対策。必ずしもスパムの防止効果があるわけじゃないのでやってもいいけどやらなくてもいいかなという感じ。

検索エンジンにクロールさせない

検索結果の一覧に問い合わせのページを表示させないようにしてスパムに減らす。フォームのあるページがクロールされないようにする。

User-agent: *
Disallow: /bbs/postForm
  • METAタグのrobots
<meta name="robots" content="noindex" />

そのほか、検索エンジンがインデックスしたページの削除を依頼する、フォームへのリンクはjsで文字列として生成するという対応で検索エンジン経由の流入を制限する。

積極的なスパム投稿対策

メーラーで振り分ける

スパム判定をメーラーに任せて受信時に振り分ける。使ってるメーラーの種類によるけど設定画面から振り分け設定をする。