Как читать текстовые записи длиной более 255 символов в правильном порядке

#dns #dkim #dnsjava

Вопрос:

Я использую библиотеку DNSJava для извлечения записей DKIM TXT для данного селектора доменного имени. Я хочу убедиться, что прочитал запись в правильном порядке, когда размер записи превышает 255 символов и в результате охватывает несколько строк. В соответствии с документом RFC и документом RFC мы должны объединить все строки в результате, но это не говорит нам, вернет ли DNS-сервер строки записи в правильном порядке.

Например : «v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCUI5E9hZhMEEgjqF6fHNYYBmAEcF7DN2v/FA6yiY/a3R2L8ebGQjCdP2m3PfqLk8ovVd84eJ», «FkNuXGEsR0rXEHveOjc161z1tz4TGzPC5pGmjuzlYaibUQAb8T1GLbRse ZkXhCxudeeRj7NBbCjaH1biClbp4v4/V0PLdugeGQQIDAQAB», «juzlYaibUQAb8T1GLbRse ZkXhCxudeeRj7»

В приведенном выше примере у меня нет возможности определить порядок записей. Только часть заголовка DKIM может быть определена как начало записи

Комментарии:

1. Порядок не обязательно должен быть определен — он четко определен.

2. @CherryDT Вы хотите сказать, что DNS-серверы возвращают записи в правильном порядке, и приложению нужно только объединить результат?

3. Да и нет, смотрите мой ответ ниже

Ответ №1:

Порядок этих строк не нужно определять, он четко определен. Обратите внимание, что строки, которые вы показали, не являются записями!

Похоже, вы путаете разные строки в одной и той же записи TXT с несколькими записями TXT. Вы не можете разделить строку на несколько записей, но вы можете разделить ее на несколько фрагментов в одной и той же записи, и это, вероятно, то, что вы имеете в виду.

Запись TXT может содержать несколько строк, см. RFC 1035:

 3.3.14. TXT RDATA format

     -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    /                   TXT-DATA                    /
     -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 

where:

TXT-DATA        One or more <character-string>s.

TXT RRs are used to hold descriptive text.  The semantics of the text
depends on the domain where it is found.
 

Как вы можете видеть, порядок строк является частью самих RDATA записи. DNS-сервер не должен каким-либо образом искажать его.

Например, именно так будет определена ваша примерная запись в файле зоны:

 name IN TXT ("v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCUI5E9hZhMEEgjqF6fHNYYBmAEcF7DN2v/FA6yiY/a3R2L8ebGQjCdP2m3PfqLk8ovVd84eJ"
             "FkNuXGEsR0rXEHveOjc161z1tz4TGzPC5pGmjuzlYaibUQAb8T1GLbRse ZkXhCxudeeRj7NBbCjaH1biClbp4v4/V0PLdugeGQQIDAQAB"
             "juzlYaibUQAb8T1GLbRse ZkXhCxudeeRj7")
 

…в то время как несколько записей TXT будут выглядеть примерно так:

 name IN TXT ("v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCUI5E9hZhMEEgjqF6fHNYYBmAEcF7DN2v/FA6yiY/a3R2L8ebGQjCdP2m3PfqLk8ovVd84eJ"
             "FkNuXGEsR0rXEHveOjc161z1tz4TGzPC5pGmjuzlYaibUQAb8T1GLbRse ZkXhCxudeeRj7NBbCjaH1biClbp4v4/V0PLdugeGQQIDAQAB"
             "juzlYaibUQAb8T1GLbRse ZkXhCxudeeRj7")
name IN TXT "google-site-verification=abcde_xxxxxxxxxxxxx"
name IN TXT "MS=ms1234567"
 

В последнем случае вы не можете быть уверены, в каком порядке вам вернут эти три записи ( v=DKIM1... , google-site... и MS=... ), но в любом случае это не должно иметь никакого значения.

В случае dnsjava , вы должны получить массив с различными записями (не обязательно в любом порядке) getAnswers , но для каждой записи вы должны получить ее строки (по порядку) getStrings .