リファラースパムブロッカーの処理について。
動作原理は、簡単でリファラー元のアドレスにアクセスし、そのなかのaタグの中からこのスクリプトの設置アドレスが含まれているかを確認することで、スパムであるかそうでないかを判断します。一見コストが高そうな処理ですが、近年のリファラースパムは、確実性を出すために短時間の間に数回のアクセスを試みて、簡単にしきい値を超えてしまうため、思ったよりもサーバーへの負荷は少ないようです。ただし、誤爆の可能性を考慮して、ホワイトリストに記載した場合、スパムチェックを行いません。
設定は以下のページで行います。
- :config/plugin/referer/BlackList
- リファラースパム扱いするリファラーの一部
- :config/plugin/referer/WhiteList
- 常に許可するリファラーの一部
スパム判定に使用するパラメーターは、ドメインとパスのみで、クエリは判定に使用しません。ブラックリストは自動学習します。10回を超えるアクセスがあった場合やバンフラグを付けている場合はバン対象になります。この時のアクセスはreferer_spam.logに保存されます。サービス不正利用報告にも便利だと想います。
使い方
ブラックリストは以下のような形式で指定します。
referer | count | ban |
---|---|---|
スパム扱いするリファラー | カウンター | バンフラグ |
例えば、infotopを用いたスパムの場合、
referer | count | ban |
---|---|---|
infotop.jp | 0 | 1 |
と入力することで、infotop.jp/click.php?aid=16916&iid=35086や、infotop.jp/click.php?aid=1739&iid=37469、infotop.jp/click.php?aid=8505&iid=37281、infotop.jp/click.php?aid=8505&iid=948などのアクセスを一気に弾くことができます。
ドメインが変わる場合は、
freestage-japan | 0 | 1 |
と入力しましょう。
スパムログについて
ログは、タブ区切りのサーバー時間,リファラー,UA,IPという形式で、cache/referer_spam.logに保存されます。以下は実在のスパマーです。なお、10回を超えるアクセスがあった場合は、バンフラグのあるなしにかかわらず以降のアクセスをキックします。
1298176464.3493 http://petyhnfy.blog98.fc2.com/ Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Q312461; .NET CLR 1.0.3705; .NET CLR 1.1.4322; .NET CLR 2.0.50727) 114.159.203.151 1298176539.0238 http://goo.gl/zJ947 Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30) 118.9.240.253 1298177488.242 http://petyhnfy.blog98.fc2.com/ Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Q312461; .NET CLR 1.0.3705; .NET CLR 1.1.4322; .NET CLR 2.0.50727) 114.159.203.151 1298177491.5697 http://petyhnfy.blog98.fc2.com/ Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Q312461; .NET CLR 1.0.3705; .NET CLR 1.1.4322; .NET CLR 2.0.50727) 114.159.203.151 1298177492.2151 http://petyhnfy.blog98.fc2.com/ Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Q312461; .NET CLR 1.0.3705; .NET CLR 1.1.4322; .NET CLR 2.0.50727) 114.159.203.151 1298177494.8065 http://petyhnfy.blog98.fc2.com/ Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Q312461; .NET CLR 1.0.3705; .NET CLR 1.1.4322; .NET CLR 2.0.50727) 114.159.203.151 1298177496.9437 http://petyhnfy.blog98.fc2.com/ Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Q312461; .NET CLR 1.0.3705; .NET CLR 1.1.4322; .NET CLR 2.0.50727) 114.159.203.151
制限事項
- スパムチェックの方法がHTMLタグを操作するやり方なので、JavaScriptでリンクを張っているサイトはスパム判定になる可能性があります。
- 携帯専門サイトの場合、アクセスが出来ないためこれもスパム扱いになる場合があります。
- 容量が多かったり、リンク数が多いページからアクセスした場合、ページが表示されるまでもたつきます。
他のスクリプトに組み込みたい人向け
別途、PHP Simple HTML DOM Parserが必要です。
$refにリファラー、$relに自分のサイトのアドレスを入れてください。スパムだった場合はTrueが返ります。
function is_not_valid_referer($ref,$rel){ $script = parse_url($rel); $condition = $script['host'].$script['path']; // QueryStringは評価しない。 // useragent setting $header = "User-Agent: Mozilla/5.0 (Nintendo Family Computer; U; Family Basic 2.0A; ja-JP) AppleWebKit/525.19 (KHTML, like Gecko) Version/3.1.2 Safari/525.21\r\n"; // (w $header .= "Referer: ".$rel; $header_options = array("http"=> array("method" => "GET", "header" => $header)); $header_context = stream_context_create($header_options); $html = file_get_html($ref, FALSE, $header_context); foreach($html->find('a') as $element){ // hrefがhttpから始まるaタグを走査 if (strpos($element->href,$condition)){ // aタグに自分のサイトのアドレスが含まれていた場合true(ただし、http://から判定する) return false; break; } } return true; }