txt vs DNS TXT记录中的条目

时间:2018-05-22 10:27:56

标签: php dns

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

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

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和entries字段呢?这可能与值太长的情况(例如超过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
        )

)

1 个答案:

答案 0 :(得分:2)

dns_get_record返回关联数组数组

如果你跑

 var_dump(dns_get_record("s1._domainkey.mydomain.com"));
你得到了什么?

您最初获得的输出可能是由于尝试打印出解释为更简单类型的关联数组数组而导致的工件。

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

但由于原始示例中的整个DKIM TXT记录小于255个八位字节,因此"条目中只有一个字符串"子阵列。

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

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