首页 > 解决方案 > txt 与 DNS TXT 记录中的条目

问题描述

我想知道使用 PHP 的 dns_get_record 由 DNS 查询返回的 TXT 记录中的 txt 字段和条目字段有什么区别。

例如,如果我在 's1._domainkey.mydomain.com' 上为 TXT 记录调用 dns_get_record,我会得到:

entries: ["k=rsa; t=s; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnVgd0NyrRE261IIiPqi+0H1baNyKcdj8Kea/VlSP4exzvKx8pJ01EWMwd094FV/6OCBIf7KGKgowMnWl3tW3Z5d++uZHkdgF+6xg7b9PynmX/NTo2kx92hlGgegwyulF5B7d2FM0doaCeoO4rD05jZzwi3cXx/156Gg9Xwd/Z/QIDAQAB"]

txt: "k=rsa; t=s; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnVgd0NyrRE261IIiPqi+0H1baNyKcdj8Kea/VlSP4exzvKx8pJ01EWMwd094FV/6OCBIf7KGKgowMnWl3tW3Z5d++uZHkdgF+6xg7b9PynmX/NTo2kx92hlGgegwyulF5B7d2FM0doaCeoO4rD05jZzwi3cXx/156Gg9Xwd/Z/QIDAQAB"

产生这个结果的代码是:

function retrieve_spf_record($domain) { 
    $txtRecords = dns_get_record($domain, DNS_TXT); 
    foreach ($txtRecords as $txtRecord) { 
        if (startsWith($txtRecord['txt'], 'v=spf1')) { 
            return $txtRecord; 
        } 
    } 
    return FALSE; 
}

在我看来,在这种情况下,条目与 txt 相同。但我想他们可以在其他一些场景中服务于不同的目的,否则两者都没有意义。

那么为什么会有 txt 和 entry 字段呢?这是否与值太长(例如超过 512B)的情况有关,以便将其拆分并存储在条目中?

如果上面的猜测是正确的,那么这样一个 TXT 记录的完整值将是所有条目的连接,并且应该忽略 txt 字段 - 这是正确的吗?

欢迎任何解释。谢谢!

更新:这是 PHP 的 dns_get_record 在“cisco.com”上返回的内容:

Array
(
    [host] => cisco.com
    [class] => IN
    [ttl] => 3158
    [type] => TXT
    [txt] => v=spf1 ip4:173.37.147.224/27 ip4:173.37.142.64/26 ip4:173.38.212.128/27 ip4:173.38.203.0/24 ip4:64.100.0.0/14 ip4:72.163.7.160/27 ip4:72.163.197.0/24 ip4:144.254.0.0/16 ip4:66.187.208.0/20 ip4:173.37.86.0/24 ip4:64.104.206.0/24 ip4:64.104.15.96/27 ip4:64.102.19.192/26 ip4:144.254.15.96/27 ip4:173.36.137.128/26 ip4:173.36.130.0/24 mx:res.cisco.com mx:sco.cisco.com include:spf.protection.outlook.com ~all
    [entries] => Array
        (
            [0] => v=spf1 ip4:173.37.147.224/27 ip4:173.37.142.64/26 ip4:173.38.212.128/27 ip4:173.38.203.0/24 ip4:64.100.0.0/14 ip4:72.163.7.160/27 ip4:72.163.197.0/24 ip4:144.254.0.0/16 ip4:66.187.208.0/20 ip4:173.37.86.0/24
            [1] =>  ip4:64.104.206.0/24 ip4:64.104.15.96/27 ip4:64.102.19.192/26 ip4:144.254.15.96/27 ip4:173.36.137.128/26 ip4:173.36.130.0/24 mx:res.cisco.com mx:sco.cisco.com include:spf.protection.outlook.com ~all
        )

)

标签: phpdns

解决方案


dns_get_record返回关联数组的数组

如果你跑

 var_dump(dns_get_record("s1._domainkey.mydomain.com"));

你得到了什么?

您最初得到的输出可能是由于尝试打印出被解释为某种更简单类型的关联数组数组而导致的伪影。


在这两种情况下,“条目”字符串都小于 255 个八位字节(ASCII 字符),这是通用 DNS TXT 记录的最大长度。

但是由于原始示例中的整个 DKIM TXT 记录少于 255 个八位字节,因此“条目”子数组中只有一个字符串。

在示例中,DKIM 记录的总长度为 405 个八位字节,因此根据RFC 4408cisco.com,它必须在 DNS 中显示为两个 TXT 记录。并且子数组中的两个字符串的长度都小于 255 个八位字节,所以看起来你的最大长度理论是正确的。entries

为方便起见,主关联数组的txt元素包含已连接的 TXT 记录。如果您出于某种原因需要原始的单个 TXT 记录,elements子数组可以为您提供它们。


推荐阅读