php - 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
)
)
解决方案
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
子数组可以为您提供它们。
推荐阅读
- swift - Swift'compactMap'Sequence 方法的时间复杂度
- java - 模式匹配器有效编号 java
- nuget - 如何摆脱“NU3012 Package xunit,作者主签名发现链构建问题,证书被吊销”错误?
- wordpress - 如何获取所有语言的 post slug?
- angular - Angular Elements 不能用大括号绑定值
- curl - 将 cURL JSON 数据转换为 pycurl
- java - 如何生成带有多个按钮和递增标签的 GUI?
- github - 从 GitHub 存储库检索详细信息
- java - 使用 JMockit 时出错:无法初始化类 mockit.coverage.Metrics
- ios - 从 iOS 捕获 3D 图像(摄影测量)