You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 14:18:09