【Drupal】Spamモジュールの改修

Submitted by yao on Mon, 2005/02/21 - 23:26.

コメントスパムを防いでくれて非常に重宝していたSpamモジュールですが、実はトラックバックスパムには全く効かないことが判明。
なんてサノバビッチな仕様なんだ!
というわけで対策を講じました。

方針はいくつかあります。

  1. TrackbackモジュールとSpamモジュールを連携させる
  2. Trackbackモジュールにフィルタリング機能をつける

・・・いくつかっていうか二つだけだった!

1.の方針でいけば、SpamモジュールのURLフィルターや正規表現フィルターが活用できてなんだか良さそうです。でもなんだかめんどくさそうです。

2.はかなり応急処置的ですが、なんだかとても簡単そうです。

というわけで2.でケテーイ!( ´_ゝ`)

フィルタリングの方法としては、CNETさんが採用しているやり方にしました。
具体的には、

Source:CNET
SPAM TrackBack対策としてTrackBackで指定されるURLとPingを打ってきたサーバーのアドレスが一致するかどうかを確認し、違う場合はTrackBackを受けない仕組みとなっております。その為ご利用のサービスやソフトウェアの種類によってはTrackBackが行えない場合がございます。ご了承下さい。
という感じ。ご了承ください。

まずTrackbackモジュールに以下の関数を追加する。

/**
* ポストされたURLとPing送信サーバが同一IPアドレスかどうかを確認する
* @param string $url ポストされたURL
* @param string $ip Pingを送信したIP
* @return boolean
*/
function trackback_isvalid($url, $ip) {
$result = FALSE;
if ($url && $ip) {
$urlinfo = parse_url($url);
$ips = gethostbynamel($urlinfo['host']);
foreach ($ips as $key => $val) {
if ($val == $ip) {
$result = TRUE;
break;
}
}
}
return $result;
}

あとは、この関数を使ってtrackback_receive()内の条件分岐を変更。

旧:
if ($trackback->url && valid_url($_REQUEST['url'], TRUE))

新:
if ($trackback->url && valid_url($_REQUEST['url'], TRUE) && trackback_isvalid($_REQUEST['url'], $_SERVER['REMOTE_ADDR']))

おちまい。これで大抵のトラックバックスパムは弾けるでしょう。

ただし、ブログサービスによってはスパムではないのに弾かれてしまう場合があるかもしれないので、弾いた場合はメールでレポートするなどするといいかもしれません。

if (!trackback_isvalid($_REQUEST['url'], $_SERVER['REMOTE_ADDR'])) {
ob_start();
print_r($_REQUEST);
print_r($_SERVER);
$str = ob_get_contents();
ob_end_clean();
mb_send_mail('xxx@xxx.com', 'TRACKBACK ERROR', $str);
}

とか。超簡易版ですが。
$GLOBALSでもいいかもしれません。

しかし、こういうつまんない仕様のモジュールはもうやめてほしいですね・・・