リファラースパムブロッカーの処理について。

動作原理は、簡単でリファラー元のアドレスにアクセスし、そのなかのaタグの中からこのスクリプトの設置アドレスが含まれているかを確認することで、スパムであるかそうでないかを判断します。一見コストが高そうな処理ですが、近年のリファラースパムは、確実性を出すために短時間の間に数回のアクセスを試みて、簡単にしきい値を超えてしまうため、思ったよりもサーバーへの負荷は少ないようです。ただし、誤爆の可能性を考慮して、ホワイトリストに記載した場合、スパムチェックを行いません。

設定は以下のページで行います。

:config/plugin/referer/BlackList
リファラースパム扱いするリファラーの一部
:config/plugin/referer/WhiteList
常に許可するリファラーの一部

スパム判定に使用するパラメーターは、ドメインとパスのみで、クエリは判定に使用しません。ブラックリストは自動学習します。10回を超えるアクセスがあった場合やバンフラグを付けている場合はバン対象になります。この時のアクセスはreferer_spam.logに保存されます。サービス不正利用報告にも便利だと想います。

使い方

ブラックリストは以下のような形式で指定します。

referercountban
スパム扱いするリファラーカウンターバンフラグ

例えば、infotopを用いたスパムの場合、

referercountban
infotop.jp01

と入力することで、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-japan01

と入力しましょう。

スパムログについて

ログは、タブ区切りのサーバー時間,リファラー,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;
}