Wordpress 有個叫 spam karma2 的 plugin,好是好用,但是面對一天數百近千的 Trackback(TB) + Comment(CMT) 的 spams,想要在裏面把正常的 comment 挖出來,覺得真不是人該做的事情。

幫裏有人提倡「發正念除spam」,不過我想我的正念一定是不夠強,spams 不但未見減少,反而還有增加的趨勢,道消魔長,這種事情也不是第一天了。雖然最近有人「見證」說發正念可以連跑完的汽油都能加滿,不過我還是寧願回到技術面來解決這件事情。

在議事堂(?)詢問了一下「Spam karma2 可不可以在符合某種條件下就把 spam 砍掉?」得到的回答是不行。還好廖董提供了幾種方法來把這些有的沒的spam砍掉,也就是這篇《用 htaccess 擋 spam》。一用之下,的確少了很多 Trackback 的 spam。

但怪的是如果全部都用在綠島上,就是… 會慢一些。最終,我只用了廖董說的第一招 SpamHuntress


<Files trackback>
	<Limit POST>
 		SetEnvIf User-Agent "Mozilla" trackers
		SetEnvIf User-Agent ^$ trackers

		Order allow,deny
		Allow from all
		Deny from env=trackers
	</Limit>
</Files>

光是如此,就已經少掉不少 spam。可是… 還是有些 Trackback spam 可以進來。查了一下 access.log,像這樣的 spam 還是會溜進來:


"POST /wp/2005/08/12/233/trackback/ HTTP/1.1" 200 16 "" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"

因此回頭又去查了.htaccess的用法,本來想要用<LocationMatch>之類的東西來擋,無奈這類指令裡面不是不能在 htaccess 裡面用,就是裡面不可以包含 <Limit>這樣的東西。
(如果各位有可以直接寫在 htaccess的方法還請不吝告知,感謝)

想來想去,還是用 SpamHuntress 的想法,去修改 Wordpress。我在 wp-trackback.php 裡面加了一段 code:
(放在這兩行的後面:

// trackback is done by a POST
$request_array = ‘HTTP_POST_VARS’;

)


$my_TBspam_block_flag = false;

if ( preg_match("/Mozilla/i",$_SERVER['HTTP_USER_AGENT'])) $my_TBspam_block_flag= true;
if ( preg_match("/Opera/i",$_SERVER['HTTP_USER_AGENT'])) $my_TBspam_block_flag= true;
if ( $_SERVER['HTTP_USER_AGENT'] = "" ) $my_TBspam_block_flag= true;

if ($my_TBspam_block_flag && ($_SERVER['REQUEST_METHOD']=="POST") ) exit;

這樣就可以擋住前面說的狀況。

如果願意,可以把 my_TBspam_block_flag=true 的情況多加一些,像是 HTTP_USER_AGENT 是 “-” 的等等。不過現在這樣已經可以讓 TB spam 少去很多了。

萬一 spammers 如果用正常會看到的 trackback 的 HTTP_USER_AGENT 的話,那就真的是麻煩了。