フォームからの問い合わせを受け付けているとスパムが多く届く。数が多いと削除する手間と時間がけっこうかかるので何かしらの対応をしようと思い、対策を調べたのでメモ。リンク先にmailtoというのではなく、フォームからの受付を対象にした対策。
まずは直接的な対策から。スパム自体を送信できなくする、サーバー側ではじく方法を紹介。
hidden要素を追加する
<input type="hidden" name="mail" value="あいうえお"> <input type="hidden" name="address" value="">
フォームの内容とは直接関係ないinputタグを入れておき、botによる改変があったかを調べるやり方。mailにあいうえお以外が入力されていたらスパムと判定する。また、addressに変な文字が入っていればそれもスパムと判定。
※上記は例なのでname、value属性の値は適宜変更
◎メリット
サーバー問わず対策できる
閲覧者に負担がない
◎デメリット
hiddenのinput要素に変更を加えないbotの送信は防止できない
画像認証をする
画像を生成して、そこに表示された文字を入力してもらう。いろんなサービスで取り入れられてるのでよく見る。でも文字が判別しづらくて困ることがあるからあまり親切じゃないかも。
◎メリット
目視での確認が必要なのでスパム対策に効果あり
◎デメリット
表示される文字が読みにくい、入力作業が手間
サーバーに画像を扱うライブラリが入っていないと使えない
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を実行するボットには効果がない
以下は間接的な対策。必ずしもスパムの防止効果があるわけじゃないのでやってもいいけどやらなくてもいいかなという感じ。