Txt vs записи в записи DNS TXT

lgc_ustc спросил: 28 апреля 2018 в 08:47 в: php

Интересно, какая разница между полем txt и полями записей в TXT-записи, возвращаемой DNS-запросом, с использованием dns_get_record из PHP.

Например, если я вызываю dns_get_record на 's1._domainkey.mydomain. com 'для записи 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, так и записи? Может ли это быть связано со сценарием, когда значение слишком велико (например, более 512B, например), чтобы он был разделен и сохранен в записях?

Если вышеуказанное предположение верно, то полное значение такая запись TXT будет все конкатенированные записи, и поле txt должно быть проигнорировано - это правильно?

Любые объяснения будут приветствоваться. Спасибо!

Обновление: вот что возвращает dns_get_record PHP на '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 ответ

Есть решение
telcoM ответил: 28 апреля 2018 в 09:07

dns_get_record возвращает массив ассоциативных массивов .

Если вы запустите

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

, что делать вы получаете?

Выбранный вами результат может быть артефактом, вызванным попыткой распечатать массив ассоциативных массивов, интерпретируемых как более простой тип.


В обоих случаях, строки "записи" все меньше 255 октетов (символы ASCII), что является максимальной длиной общей записи DNS TXT.

Но так как вся запись DXIM TXT в вашем исходном примере меньше 255 октетов, в поддиапазоне "entries" будет только одна строка.

В примере cisco.com общая длина записи DKIM составляет 405 октетов, поэтому она должна быть представленный в DNS как две записи TXT, как RFC 4408. И две строки в поддиапазоне entries имеют длину менее 255 октетов, поэтому, похоже, ваша теория максимальной длины верна.

Элемент txt основного ассоциативного массива содержит записи TXT, уже конкатенированные для вашего удобства се. Если по какой-то причине вам понадобятся необработанные отдельные записи TXT, подматрица elements может предоставить их вам.

lgc_ustc ответил: 28 апреля 2018 в 09:22
Я считаю, что выход, который я получил, был без изменений. См. Обновление.
USD Matt ответил: 28 апреля 2018 в 09:28
Вы определенно выполняете эту функцию или используете какую-то библиотеку? Я повторно протестировал PHP5 & 7, оба производят простой массив ассоциативных массивов, как описано.
lgc_ustc ответил: 28 апреля 2018 в 10:48
Мой код выглядит так: function retrieve_spf_record ($ domain) {$ txtRecords = dns_get_record ($ domain, DNS_TXT); foreach ($ txtRecords как $ txtRecord) {if (startsWith ($ txtRecord ['txt'], 'v = spf1')) {return $ txtRecord; }} return FALSE; }
lgc_ustc ответил: 28 апреля 2018 в 10:49
Извините за формат вышеприведенного кода.
lgc_ustc ответил: 28 апреля 2018 в 10:50
Я не пользуюсь какой-либо другой библиотекой.