PHP checkdnsrr函数查询黑名单返回错误结果问题排查
问题原因分析
1. Spamhaus的DNS查询限制
Spamhaus的Zen黑名单列表**禁止使用公共递归DNS(如Google DNS、Cloudflare DNS)**进行查询。这类公共DNS会返回虚拟的127.0.0.x段IP,目的是阻止非授权的批量查询,导致你的函数误判IP在黑名单中。
2. 仅检查A记录存在性不严谨
你的代码只要检测到A记录存在就返回true,但Spamhaus的合法黑名单返回值是127.0.0.2到127.0.0.11范围内的IP。如果DNS返回了这个范围外的A记录(比如污染或错误解析),也会导致误判。
3. 域名拼接多余后缀点
代码中拼接的域名多了一个结尾的点($host . "."),虽然FQDN结尾的点符合规范,但部分DNS服务器可能解析异常,这也是潜在问题。
解决方案
1. 使用合规的DNS服务器
改用你的服务器本地DNS(由ISP提供)或Spamhaus官方授权的付费DNS服务,避免公共DNS的限制。
2. 验证返回的IP范围
不要只检查A记录是否存在,而是获取所有返回的A记录,验证是否属于Spamhaus定义的合法黑名单IP段:
$ip = '185.91.153.27'; $host = 'zen.spamhaus.org'; $reverse_ip = implode(".", array_reverse(explode(".", $ip))); $query_domain = $reverse_ip . "." . $host; $records = gethostbynamel($query_domain); if ($records !== false) { foreach ($records as $record) { // 检查是否为Spamhaus合法黑名单IP if (str_starts_with($record, '127.0.0.') && in_array((int)substr($record, -1), range(2, 11))) { return true; } } } return false;
3. 考虑官方API
Spamhaus提供了官方API接口用于查询,相比DNS查询更稳定,但需要遵守其调用频率限制和使用条款。
内容的提问来源于stack exchange,提问作者Native Nova
相关产品推荐
相关产品推荐

