【PHP】DNSBLを利用して特定のIPアドレスをブロックする方法

悪意あるIPアドレスをブロックするために、DNSBLを利用してそのIPアドレスのDNSBL掲載状況を調べるコードを書きました。

論よりコード

<?php
/**
 * DNSBL検索
 * @param string $ip ホストのIPアドレス
 * @return string[][] 0:DNSBL | string[][] 1:ステータス
 */
function dnsblLookUp($ip) {

	$outArr = array();

	// 検索するDNSBLを設定します。必要に応じて追加してください。
	$dnsbl_lookup = array(
		"b.barracudacentral.org",
		"bl.spamcop.net",
		"zen.spamhaus.org",
		"dnsbl-1.uceprotect.net",
		"dnsbl-2.uceprotect.net",
		"dnsbl-3.uceprotect.net",
		"dnsbl.dronebl.org",
		"dnsbl.sorbs.net",
		"spam.dnsbl.sorbs.net",
		"bl.spamcop.net",
		"recent.dnsbl.sorbs.net",
		"all.spamrats.com",
		"cblplus.anti-spam.org.cn",
		"dnsbl.anticaptcha.net",
		"ip.v4bl.org",
		"fnrbl.fast.net",
		"mail-abuse.blacklist.jippg.org",
		"singlebl.spamgrouper.com",
		"spam.abuse.ch",
		"spamsources.fabel.dk",
		"virbl.dnsbl.bit.nl",
		"cbl.abuseat.org",
		"dnsbl.justspam.org"
	);

	// IPアドレスを逆順にする。
	$reverse_ip = implode(".", array_reverse(explode(".", $ip)));

	foreach ($dnsbl_lookup as $host) {

		// ホスト名で正引きを行い、Aレコードの有無を確認します。
		if (checkdnsrr($reverse_ip . "." . $host . ".", "A")) {

			$outArr[] = array($host, 'Listed');
		}
		else {

			$outArr[] = array($host, 'Not Listed');
		}
	}

	return $outArr;
}

// 以下、使用例。
$url = Trim(htmlspecialchars('https://rajaka.net/'));
$url = strtolower($url);
$url = str_replace(array('http://', 'https://'), '', $url);
$url = Trim("http://$url");

if (!filter_var($url, FILTER_VALIDATE_URL) === false) {

	$url = parse_url(Trim($url));
	$host = $url['host'];
	$getHostIP = gethostbyname($host);
	$myHost = str_replace('www.','',$host);
	$dataArr = dnsblLookUp($getHostIP);
}

echo 'Domain:'.$myHost.'<br />';
echo 'IP:'.$getHostIP.'<br /><br />';

foreach ($dataArr as $val ) {
	echo $val[0].':'.$val[1].'<br />';
}

ポイント

あるホストがブラックリスト入りしているかどうかを調べる場合は、「ホスト名.DNSBL名」を正引きし、

あるIPアドレスがブラックリスト入りしているかどうかを調べる場合は、「IPアドレス逆順.DNSBL名」を正引きします。

今回のコード例は、あるIPアドレスがブラックリスト入りしているかどうかを調べるサンプルですのでIPアドレスが「202.172.26.6」、DNSBLが「b.barracudacentral.org」の場合は

checkdnsrr("6.26.172.202.b.barracudacentral.org", "A");

のように”6.26.172.202.b.barracudacentral.org”というホスト名で正引きを行います。