メールアドレスのホスト部分を DNS でチェックする

SPAM コメント対策として、コメント欄に入力いただいたメールアドレスのホスト部分を DNS でチェックし、存在するホストかどうかを確認するようにしてみてます。
とりあえず2週間ほど動作させていますが Akismet のチェックまで到達する SPAM コメントはかなり減ったようです。
ただ、このチェックに引っかかったコメントは問答無用で叩き落しているので、ひょっとすると SPAM ではないコメントも叩き落しているのかもしれません。
もし、コメントできないという人があれば、サイドバー右上に記載されているメールアドレス宛てにメールください。Twitter アカウントを持っている場合は、@wokamoto まで知らせていただいても大丈夫です。

この機能は、もうしばらく当サイトで動作させてみて、問題なさそうなら Quick Comments の次期バージョンに管理画面での選択式にして取り込む予定です。

check_comment_flood フィルタをフックして、入力されたメールアドレスのホスト部分を切り出し、DNS 問い合わせしています。
以下のような感じのものを my-hacks.php または テーマの functions.php に書いておけば良いでしょう。

<?php
function rejectUnknownEmail($ip, $email, $date) {
	$email_host = trim(preg_replace('/^&#91;^@&#93;*@(.*)$/', '$1', $email));
	$find_it = false;
	if (function_exists('dns_get_record')) {
		$check_recs = dns_get_record($email_host, DNS_MX);
		if (isset($check_recs&#91;0&#93;&#91;'ip'&#93;))
			$find_it = $check_recs&#91;0&#93;&#91;'ip'&#93;;
		unset($check_recs);
	} elseif (function_exists('gethostbyname')) {
		$find_it = gethostbyname($email_host);
	} elseif (class_exists('Net_DNS_Resolver')) {
		$resolver = new Net_DNS_Resolver();
		$response = $resolver->query($email_host, 'MX');
		if ($response) {
			foreach ($response->answer as $rr) {
				if ($rr->type === 'MX') {
					$find_it = $rr->address;
					break;
				}
			}
		}
		unset($response);
		unset($resolver);
	} elseif (function_exists('checkdnsrr')) {
		$find_it = (checkdnsrr($email_host, "MX") === true);
	}

	if ($find_it === false)
		wp_die('Error: Your E-Mail Address includes Unknown Host.');
}
add_action('check_comment_flood', 'rejectUnknownEmail', 10, 3);
?>

Twitter で、@ayunyan さんに メールの配送先は基本的にMXレコードを引くのでAレコードがない場合もあると指摘されました。
確かに、その通り。何で勘違いしていたんだろう。
と言うわけで、ソースを修正しておきました。

2 thoughts on “メールアドレスのホスト部分を DNS でチェックする

  1. をかもと 投稿作成者

    みなみさん、どもです。

    実は、もうひとつほど実験的に RBL.JP のブラックリストを利用して SPAM をハネるってのもやってます。
    これも Quick Comments に組み込む予定。 😀

    返信
  2. みなみ

    難しいことはわからないけど、いま使ってる Quick Comments で
    スパムコメントをはじいてくれるのはうれしい機能ですね。
    たのしみです〜!いま困ってるのはケータイから自分で
    コメントすると100%アキスメットくんが食べちゃうことかな。
    ちっとも学習してくれまへん。 😕

    返信

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください