スポンサーリンク
最近、スパムコメントやトラックバックが多くてウザいと言っている方がたくさんいます。
そこで、スパム対策スクリプトを書いてみました。このブログでは、意図どおりに動いています。
当ブログにスクリプトを設置したのは2013年6月15日午前0時ですが、今のところスパムはゼロです。ただ、このブログには元々スパムが少ないので、スクリプトの成果が出ているのかどうかは判断できません。
追記:
スパム送信側が、このページで公開したソースを読めばブロックは破られてしまいます。なので、ソースは非公開でこっそり使うのが正しいですが、あえて公開します。
詳しいことは後述しますが、本来、スパムの対策をJavaScriptで書くのは無意味です。ですが、あるスパムはHTMLを取得して解析し、コメントやトラックバックの送信先アドレスを抽出しているのが間違いありません。それで、この対策スクリプトが有効に作用するかどうかを探りたいと思います。
このスクリプトを使用中の、その他のブログ
- イタリアンな日々
- 設置日:2013年06月15日
- goods and life +
- 設置日:2013年06月18日
- 楽して稼ぎたい~お小遣い稼ぎ情報局~
- 設置日:2013年06月18日
*注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と同じ名前に書きかえて使ってください。
設置後は自分でコメントとトラックバックをテスト送信して、ちゃんと送れることを確認してください。自分で試さないと、書き込めなくなっていても誰も伝えられません。(書き込めないので)
このスクリプトに効果があるなら、画像認証は不要になります。(ただし「コメント・トラックバックURLにランダムな認証キーを使う」の設定は必ず有効にしてください)
逆に、これでもスパムが来るのなら、それはHTML全文を正規表現でスキャンしているのだろうから、ダミーURLを噛ませれば対処できます。でもそれは、今はやりません。やると相手の手の内が読めなくなるので、技を小出しにして探ります。
今回のソース公開は、このスクリプトがスパム対策として有効かどうかを確かめたかったからです。ただ、このブログには元々スパムが多くありません。なので、導入した方は、スパムが来なくなったかどうかをコメントくださると助かります。
スクリプト作成に至った経緯
先日、スパム対策「コメント・トラックバックURLにランダムな認証キーを使う」は常にオンという記事を書きました。
その記事に書いたとおり「コメント・トラックバックURLにランダムな認証キーを使う」という設定を有効にすれば、コメントの画像認証と同じ役割を果たします。
しかし「URLにランダムな認証キーを使う」を有効にして、「画像認証」を止めたところ、大量にスパムが来たとのご報告をいただきました。
これは、どういうことかというと、そのスパムはHTMLを取得して解析し、コメントやトラックバックの送信先アドレスを抽出しているということです。
アドレスがわかれば、サイトを開く必要はない
スパム対策「コメント・トラックバックURLにランダムな認証キーを使う」は常にオンに書いたとおりで、ブログのURLというのは規則的なパターンで出来ています。そのパターンがわかっていれば、いちいちブログを開かずに、直接スパムコメントやトラックバックを送れます。
スパムコメントが書き込まれたからといって、ブログの記事は読まれていない、というか開かれていないのです。通常は。
ですから本来、スパムの対策をJavaScriptで書くのは無意味です。なぜなら、スクリプトのあるページは開かれることがなくスパムは送信されるので、スクリプトは作用しないからです。
しかし、ランダムURLのコメントフォームやトラックバックにスパムが届いたのであれば、それはページを開いてHTMLを取得した後、それを解析してコメントないしはトラックバックの送信先URLを抽出していることになります。
つまり、ランダムURLを調べるために、ブログを一回読み込んでいる。だったら、それ用のスクリプトを書いて、読めなくしてやろう。それなら有効に働くかもしれない。ということで書いてみたのが、今回のスクリプトです。
[追記]
画像認証はなぜ効果があるのか?
ランダムなURLが抽出されたのに、「画像認証」が破られないのはなぜでしょうか?答えは簡単で、それが、文字ではなく「画像」だからです。コンピュータにとって「文字」と「画像」は明確に違うものです。
人間が上の画像を見れば、そこに書いてあるのは「aSEeW@」という6文字だと認識できます。しかし、コンピュータにはわかりません。コンピュータにとって、それは文字ではなく「画像」だからです。人間にとっては文字でも、コンピュータにとっては「aSEeW@」という「形」が書いてある画像です。
「画像認証」が破られないのは、コンピュータが「aSEeW@」という文字を抽出できないからです。
ただ、個人的には画像認証はキライです。「画像認証が有効なブログは、スパムに屈したブログであって、本来ブログの管理者が費やすべきスパム対策の労力を、コメント投稿してくれる読者に押し付けている」と、そう思うからです。
関連コンテンツ
スポンサーリンク
早速、試してみたんですが、
コメントは、ちゃんと入れる事が出来るんですが、
トラックバックのURLが表示されないようになりました
ちゃんと、Tomさんが赤い字で書かれてい部分も確認して
同じ文字にして、確認もしたんですが・・
どうしてなのか分かりますか?
ガブさんのブログは、サイドバーの「最新記事」とか「リンク集」のタイトルに葉っぱがあるから、元のスキンは「ガーデン」ですよね。これは「パート(中略)生活」がベースに使っているスキンと同じです。それならトラックバック部分は次のソースのはずなんです。
<h3 id=”trackbackTitle”>トラックバック</h3>
<div class=”trackbackList”>
<BlogEntryIfAllowPostPings>
この記事へのトラックバックURL<br />
<SpamFilterTrackbackNotice><a>{$BlogEntryTrackbackLink$}</a></SpamFilterTrackbackNotice><br />
</BlogEntryIfAllowPostPings>
</div>
上の{$BlogEntryTrackbackLink$}を削除して、スクリプトを適用するというのが、この記事の内容です。ところが、ガブさんのブログは今、HTMLが下のようになっています。
<h3 id=”trackbackText”>トラックバック</h3>
この記事へのトラックバックURL<br />
<a href =”http://fanblogs.jp/gab/tb_ping/1498/EDqanA699AIS708pe7Dh4rrqmdIA” onmouseover=”showPopup(event, ‘このブログでは<b>スパム対策</b>のためスパムフィルター機能(<b>禁止ワード</b>や、<b>特定のIPアドレス</b>からのトラックバック禁止、など)が設定されています。<br><br>トラックバックを送信しても、禁止条件に該当する場合は反映されません。’)” onmouseout=”hidePopup(event);” onclick=”return false”><a></a></a><br />
これは、タイトルのIDだけ比べても明らかに改変されています。
<h3 id=”trackbackTitle”>トラックバック</h3>
<h3 id=”trackbackText”>トラックバック</h3>
スキンのソースを推測すると、こうなっているのではないかと思います。
<h3 id=”trackbackText”>トラックバック</h3>
<BlogEntryIfAllowPostPings> この記事へのトラックバックURL<br /> <SpamFilterTrackbackNotice><a>{$BlogEntryTrackbackLink$}</a></SpamFilterTrackbackNotice><br />
</BlogEntryIfAllowPostPings>
この部分を本来のものに戻し、その上で{$BlogEntryTrackbackLink$}を削除してください。
気づいたので、ついでに書いておくと<head>のすぐ下にある
<!–Faviconの設置 –>
<link rel=”icon” href =”ファビコンのURL” type=”image/x-icon”イタリア国旗>
これはいらないです。(URL入っていないし)
今、突然気づいたんだけど、ガブさん自身ではソースの改変してないですね。
スパムフィルタの設定で
「トラックバックでスパムフィルターが有効であることを知らせる」
のチェックをオフにすれば、HTMLが元の形に戻ります。
ので、この記事がそのまま有効になるんじゃないかな?
いや、改変している。
元の状態 <h3 id=”trackbackTitle”>トラックバック</h3>
ガブ式 <h3 id=”trackbackText”>トラックバック</h3>
下のスクリプトが動くためには<div id=”trackbackText”>から</div>までの間にaタグがあるという前提がある。でもガブさんのソースではid=”trackbackText”がh3にかかっている。
<!– スパム撃退スクリプト ここから –>
<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>
<!– スパム撃退スクリプト ここまで –>
記事の中で、「このスクリプトを使用中の、その他のブログ」という枠を作って、勝手にリンク張っちゃったけど、迷惑かな。消した方がいい?
ご指南ありがとうございます
ちゃんと表示されるようになりました
ファビコンの部分も削除しました
かこさんがおっしゃってますが、
Tomさん意外の方からも、
色々教えてもらって、カスタマイズしているので、
自分でも分からない内に改変していると思います
あと、もちろんリンクOKですよ
これで、スパム撃退の役に立てれば嬉しいです
様子を見て
スパムが来るみたいだったら
また報告しますね
いや、直っていない。
トラックバックURLが表示されているのは{$BlogEntryTrackbackLink$}を消していないから。
これだとスパムが来たら防げない。今は、まだスパムが来ていないだけ。
</div><!– entry –>から
<div id=”commentForm”>までの間を下のとおりに書きかえてから、
{$BlogEntryTrackbackLink$}を削除。
</div><!– entry –>
<BlogEntryIfAllowPings>
<h3 id=”trackbackTitle”>トラックバック</h3>
<BlogEntryIfAllowPostPings>
<div id=”trackbackText”>
この記事へのトラックバックURL<br />
<SpamFilterTrackbackNotice><a>{$BlogEntryTrackbackLink$}</a></SpamFilterTrackbackNotice><br />
</div>
</BlogEntryIfAllowPostPings>
<BlogPings>
<a id=”p{$BlogPingID$}”></a> » <a href=”{$BlogPingUrl$}” target=”_blank”>{$BlogPingTitle$}</a> from {$BlogPingBlogName$}<br />
{$BlogPingExcerpt$} <a href=”{$BlogPingUrl$}” target=”_blank”>[Read More]</a>
<div align=”right” class=”posted”>Tracked on {$BlogPingDate format=”%Y年%m月%d日(%a) %H:%M” language=”jp”$}</div>
</BlogPings><BlogElse>
</BlogElse>
</BlogEntryIfAllowPings>
<div id=”commentForm”>
何度もお手数かけてすいません
一応、大丈夫だと思いますが、
すいませんが、もう一度確認してもらえると助かります
スキンは直ってます。
ただ、スパムフィルターで「トラックバックでスパムフィルターが有効であることを知らせる」がONになっていると問題があるかも。
この設定のままでもいいかもしれないし、だめかもしれない。それはスパム側のプログラムの出来栄え次第なので、今は判断できません。
もしトラックバックにスパムが来たら、上の設定をOFFに変更してください。
コメントを貰ったので
もう、分かってらっしゃると思いますが、
いきなり、3000件以上のスパムが来てしまいました
今「スパムフィルターが有効であることを知らせる」を無効にしたので、
また、しばらくこれで様子を見ないといけないですね
3000か。それは消すのが大変だったね。
こちらの手の内を全部まとめて出せばいいんだけど、今の状態で様子を見てほしい。迷惑かけます。
前回、スパムが来て困ったって時は、
40件くらいだったんですが、
それが、桁も急に増えたので、確かに削除も大変でした
今日は、スパムは来てません
自分のブログで実験していただいて結構ですよ
これが、その後のスパム対策になると、
後々、自分も助かりますしね
ありがとうございます。
これ使わせてもらいました。
自分で自分とこ宛にテストして、コメントもトラバもいけてます。
なんかベースにしているテンプレートによっては微妙に名前が違っていたり、idになっているとも限らないみたいです。
みんながウザがっているコメントスパムの送信元IPは北京だったり台湾だったり韓国だったりタイだったり、トラバはウィーンだったりとまばらでも、スパマーが付けてくるリンクのジャンプ先はほぼ偽ブランドへのものでしょ?
だったら、中の人はいつもの偽もの関係の支那人韓国人だと思います。
うちに書き込まれたコメントスパムのパターンとしては、100%人力って感じでしたよ。
トラックバックに関しては、スパムではないけど、トラックバックの使い方の意味がわかっていない人からの困ったトラックバックがあったりして削除した事はあるけど、本職スパマーのトラックバックスパムはまだ来た事がないです。
で、コメントスパム、これがなぜ人力だとわかったかというと、たまた偶然で、解析をみていた時にバンコックから2回、ソウルから2回、それをたまたまリアルタイムで発見していて、その度そのまま泳がせてウォッチしてみました。
まずうちの記事に用事がないだろう東南アジアの怪しい地域からアクセスがある事自体が珍しいので、そういう地域はリアルタイムでも目立つわけです。
手口は
1.「ファンブログ」とカタカナで検索してます、検索結果に出てきたページをたぶん適当に開いてます。
2.人力でページを開き、用意してある文章とリンクをブログのコメント欄にコピペします。
3.開いたメージに画像認証があっても、そこは人力なのでクリアします。
4.書き込みに成功すると、場合によっては書き込めたページの記事番号よりも若い記事番号をURLにランダムに付けてページを開いたりもしてます。
記事的には関連がないもの。で、適当に開けてコピペを続けようとする(しないときもある)。
4.試しに、ウォッチ中に野放しにしておいて、書き込みに成功させます。
5.書き込んだあと、書き込めたかどうかをわざわざチェックしています。
何回目かの書き込み中に、禁止IPを適用してみると、人力で画像認証を入れても急に書けなくなったため、そこで約10分以上、20分近くしつこく再トライをくり返して諦めています、あきらかに人間がやってます。
なぜコピペか、というと、このあいだTomさんちに貼られてたチャイナの車のパーツのスパムの文章とリンク、あれうちにも来てたんですけど、Tomさんち経由でうちに来てます。
で、Tomさんちに貼られてた文章と同じものが書き込まれていました。
リンクは名前欄なのでズレてないんだけど、どうもスパムの原稿からコピーする時のマウス操作が雑でテキトーみたいで、元の文章は全く同じものなんだけど文字の選択開始位置が数センテンスはズレてました、こういうのみてると、これも人力のコピペ作業なんだろうなと思います。
あと、コメントスパムやトラックバックスパムの書き込みに成功し、そのコメントなどを短時間で削除しないタイプの人はたぶんブクマされてますので、次回からは直接訪問してるかもしれないです。
いろいろみてると、常習的に狙われている人ってある程度偏りがある感じがします。
なので、tb_ping/~、って感じでやられちゃうのかもしれない。
ガブリンの下にリンクを張っておいた。困るなら消しますわ。
>自分で自分とこ宛にテストして、コメントもトラバもいけてます。
意味わからないんだけど。スパム業者様と同様のプログラムをお持ちですと?
もしそうなら、ソースを見たい。
自分の記事宛にトラックバックしたり、コメントを書いてテストしただけだよ~
たぶんはじめに人力でページを開けて、URLを割ってリストに加えて、
リストにいる人に対して、次回からは tb_ping/~とか若い記事番号を使ったスクリプトで人力ではない大量投稿って感じなのかなー?
こんばんは。
わたしのブログにも導入させて頂きました。
役立つスクリプトをありがとうございます(^^)
スパマーに突破されることがあれば報告しますね。
ありがとう。
記事の一覧に加えておきます。