ZAPAnet総合情報局 > ZAPAブログ2.0 > メッセージフォーム設置&スパム対策第3弾

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

2007年04月18日 プログラミングTIPS
おとといからメッセージフォームを設置しました。
Nucleusを半分やめて、100倍速を実現しました!」ときにコメントフォームは削除しましたが、メッセージだけは管理人宛に送れるように変更しました。
各記事の一番下にメッセージフォームがありますので、何かメッセージを送りたいときは利用してみてください。

以下、今回のメッセージフォーム設置とスパムトラックバックに施したスパム対策を載せておきます。

前2回のスパム対策について

今までスパム対策として、
スパム対策第1弾
スパム対策第2弾
を実施してきました。
「チェックボックスを増やす」対策と「formのhidden属性」を増やす対策でした。

「JavaScriptでフォームを表示する」スパム対策

今回は、なるべくメッセージを送る人の負担が少なくなるように、「メッセージを送るテキストエリア」と「送信ボタン」のみにしようと考えました。
名前、URLアドレス、メールアドレス入力欄は省き、チェックボックスさえも取り外しました。

スパム対策として効果的だと言われているCaptchaなどを利用した「画像認証」は、文字を打ち込むのが面倒なのと、文字自体が読みにくいのとで、なるべく取り入れたくありませんでした。
今回も試しに、利用者に負担がかからない「formのhidden属性」対策だけ組み込んでテストしてみたところ、設置からたった10分でスパムコメントが飛んできました…。

そこで、「JavaScriptでフォームを表示する」対策を組み込んでみました。
直接HTMLでメッセージフォームを表示するのではなく、javascriptを利用してメッセージフォームを表示することにより、スパムボットを欺く方法です。

document.writeを使って、このような感じで表示させてみました。
document.write('<form action="https://zapanet.info/blog/?page='+'message" method="POST">');
単純に「'+'」という部分さえもスパム対策になります。
ブラウザから見た場合は、「'+'」の部分はテキストが連結されて表示されますが、スパムボットはそのままの文字列でスパムコメントを送ってくる場合があるので、スパムをはじけます。

また、「formのhidden属性」の値を「変数にすることにより、より解読しにくくしています。
var web="1";
document.write('<input type="hidden" name="web" value="'+web+'"> ');
この例では、「web」に1が入っていなければ、コメントできないようになっています。

「JavaScriptでフォームを表示する」スパム対策の欠点

今回の「JavaScriptでフォームを表示する」対策は、「JavaScriptに対応していないWebブラウザでは表示できない」という欠点を持っています。
Ajax全盛の今の時代を考えて、対応していないブラウザからはコメントできない仕様にしました。
対応していないブラウザからコメントしたい方は、サイドバーの「Web拍手」や上部メニューの「お問い合わせ」からお願いします。

自分で動作を確認してみたところ、「SleipnirのGekkoエンジンを使っているときにATOKから文字を入力できない」場合がありましたが、原因は良くわかりませんでした。(Sleipnirを最新版にバージョンアップしたら入力できるようになりました)
何か問題があった場合や対処法を知っている方は、教えていただけると助かります。

スパムトラックバック対策

メッセージフォームからのスパム対策よりも大変だったのが、スパムトラックバック対策です。
Nucleusのトラックバックプラグインを最新バージョンにした後からスパムが増え始め、「Nucleusをリニューアル」してからはさらに増え続けました。

4月16日のたった1日だけで、「800件」もスパムが飛んできました。

導入しているトラックバックプラグインには、「言及リンクが無いトラックバックの場合は、管理人が許可したトラックバックのみ表示する」という機能があります。
ブログ自体がスパムだらけで汚い表示になってしまうことはありませんが、一日に800回もDBにInsertされる状況というのはサーバー負荷の面からも問題です。

そこで、トラックバックURLの表示もJavaScriptで表示することにしました。

それでも、スパムはすぐに減りませんでした。
一度収集したトラックバックURLを元にスパムトラックバックを打ち続けているのか、URLから推測してトラックバックを打っているのか、スパムボットの動作はよくわかりません。

仕方なく、他のスパム対策方法を実施しました。
「マルチバイト文字を含んでいないトラックバックは拒否」対策です。
//トラックバック元のタイトル、本文、ブログ名を連結
$tb_str = $title . $excerpt . $blog_name;
//文字数とバイト数を比較
if( strlen($tb_str) == mb_strlen($tb_str) ){
//半角文字だけならスパム判定で強制終了
die('');
}
PHP関数のstrlenmb_strlenの動作の違いを生かして、マルチバイト文字を含んでいるかどうかをチェックしています。
トラックバック元のタイトル、本文、ブログ名にマルチバイト文字が含まれていないなら強制終了しています。
日本のブログからトラックバックされる場合、ひらがな、カタカナ、漢字がどこにも含まれていないことはほとんどないので導入しました。
残念ながら、海外の一部ブログからのトラックバックは拒否してしまいますが、今まで一度も海外から正式なトラックバックを受けたことがないので、海外からは受け付けられない仕様にしました。


今回は、JavaScriptで表示する対策を実施しました。
JavaScriptでMD5hashなどを生成して、生成した暗号をサーバー側で合っているか確認するとよりスパム対策には効果的だと思います。
利用者に負担のかからないスパム対策は、これからも課題です。

管理人に何かメッセージを送りたいときは、今回導入したメッセージフォームを利用してみてください。