最近、スパムコメントやトラックバックが多くてウザいと言っている方がたくさんいます。
そこで、スパム対策スクリプトを書いてみました。このブログでは、意図どおりに動いています。
当ブログにスクリプトを設置したのは2013年6月15日午前0時ですが、今のところスパムはゼロです。ただ、このブログには元々スパムが少ないので、スクリプトの成果が出ているのかどうかは判断できません。
追記:
2013年6月18日04:09、2013年6月19日10:46、2013年6月20日15:04の3回、コメントスパムが一件ずつありました。ただし手入力の可能性があります。( *注1
)
(そのコメントのキャプチャを見るにはここをクリック)
スパム送信側が、このページで公開したソースを読めばブロックは破られてしまいます。なので、ソースは非公開でこっそり使うのが正しいですが、あえて公開します。
詳しいことは後述しますが、本来、スパムの対策をJavaScriptで書くのは無意味です。ですが、あるスパムはHTMLを取得して解析し、コメントやトラックバックの送信先アドレスを抽出しているのが間違いありません。それで、この対策スクリプトが有効に作用するかどうかを探りたいと思います。
このスクリプトを使用中の、その他のブログ
- イタリアンな日々
- 設置日:2013年06月15日
- 2013年6月17日トラックバックスパムあり( *注2
)
2013年6月17日以降のスパム:0 - goods and life +
- 設置日:2013年06月18日
- 2013年6月18日以降のスパム:0
- 楽して稼ぎたい〜お小遣い稼ぎ情報局〜
- 設置日:2013年06月18日
- 2013年6月18日以降のスパム:0
*注2:2013年6月17日 「トラックバックでスパムフィルターが有効であることを知らせる」を無効にしないと、URLが読まれます。
このスクリプトは ファンブログ専用 です。ただ、ロジックを理解していただければ、ファンブログ以外でも改変して使えます。改変はご自由にどうぞ。
ちなみに、これを導入すると、JavaScriptが無効なブラウザからはコメントが送れなくなります。しかし、画像認証を使っていてもそれは同じです。
送信先URLを抽出できなくする
今回書いたスクリプトがやっているのは、URLの隠蔽です。URLを隠すことで抽出できなくします。
ファンブログのスキンに、次の2ヵ所があります。
{$BlogCommentPostUrl$}
{$BlogEntryTrackbackLink$} と書かれた場所には、トラックバックURLが書き込まれます。
同様に {$BlogCommentPostUrl$} には、コメント送信先URLが書き込まれます。
今回のスクリプトは、それを以下の手順で処理します。
- 2つのURLを該当個所に書き込まず、別の場所に書いておいて、そのHTMLをサーバーが送信する。
- HTMLをブラウザで読み込んだ後、別の場所に書かれているURLを正規の場所に書き直す。
スパム側はスパム側で、別のスクリプトを使ってURLを抽出しようとするでしょう。しかし、あるはずの場所にURLがなければ読み込めないと思います。
スクリプト導入の前処理
変更が必要なスキンは「1記事」だけです。「1記事」のスキンの2ヵ所を変更します。
まず {$BlogEntryTrackbackLink$} を削除します。結果は下の様になります。
<div id=" trackbackText "> この記事へのトラックバックURL<br /> <SpamFilterTrackbackNotice><a> {$BlogEntryTrackbackLink$} </a> </SpamFilterTrackbackNotice><br /> </div>
<div id=" trackbackText "> この記事へのトラックバックURL<br /> <SpamFilterTrackbackNotice><a></a> </SpamFilterTrackbackNotice><br /> </div>
次に {$BlogCommentPostUrl$} を javascript:void(0); に変更します。
<div id=" commentForm "> <BlogEntryIfAllowComments> <BlogEntryIfAllowPostComments> <h3 id="commentTitle">コメント</h3> <div class="text">{$CommentErrMsg$} <form method="post" name="WriteCommentForm" action=" {$BlogCommentPostUrl$} "> <table border="0" cellspacing="0" cellpadding="0"> (以下略)
<div id=" commentForm "> <BlogEntryIfAllowComments> <BlogEntryIfAllowPostComments> <h3 id="commentTitle">コメント</h3> <div class="text">{$CommentErrMsg$} <form method="post" name="WriteCommentForm" action=" javascript:void(0); "> <table border="0" cellspacing="0" cellpadding="0"> (以下略)
これであるハズの場所に、URLはなくなりました。
スクリプトの導入
URLを本来の場所に書き戻すために、今回作ったスクリプトはこれです。スパム送信側は、これがわからないのでURLは見つからないはずです。
<!-- スパム撃退スクリプト ここから --> <script type="text/javascript"><!-- (function(){ var tb=document.querySelector('div# trackbackText a'); var form=document.querySelector('div# commentForm form'); if(tb){ tb.innerHTML=' {$BlogEntryTrackbackLink$} '; } if(form){ form.action=' {$BlogCommentPostUrl$} '; } })();//--> </script> <!-- スパム撃退スクリプト ここまで -->
このスクリプトを、そのままコピーして「1記事」スキンの最後の方にある {$BlogAccessCounter$} の上に追加します。スクリプト1行目の <!-- スパム撃退スクリプト ここから --> と、最後の <!-- スパム撃退スクリプト ここまで --> は、なくてもいいのですが、後で削除や書きかえを行なう際に目印になるので、このまま書き込んでください。
<div id="footer"> </div><!-- /footer --> </div><!-- /container --> ここにスクリプトを追加 {$BlogAccessCounter$} </body> </html>
スクリプトの赤字部分 trackbackText と commentForm は、スキンのidと照合して、同じ名前かどうかを確かめてください。もし名前が違うなら、スキンのidと同じ名前に書きかえて使ってください。