2016-09-22 42 views
0

如何在Delphi中使用Indy查找DNS記錄?例如,SRV記錄,SPF記錄,TEXT記錄等如何在delphi中查找帶有indy的dns記錄

我知道我們可以直接使用nslookup從Windows,但我想用印,或任何其他Delphi組件來做到這一點。

我試圖尋找谷歌,我發現這樣的事情:

function ReverseDNSLookup(IPAddress: String; DNSServer: String = 
SDefaultDNS; Timeout: Integer = 30; Retries: Integer = 3) : string; 
var 
    AIdDNSResolver: TIdDNSResolver; 
    RetryCount: Integer; 
begin 
    Result := ''; 
    IPAddress := ReverseIP(IPAddress); 

    AIdDNSResolver := TIdDNSResolver.Create(nil); 
    try 
    AIdDNSResolver.QueryResult.Clear; 
    AIdDNSResolver.WaitingTime := Timeout; 
    AIdDNSResolver.QueryType := [qtPTR]; 
    AIdDNSResolver.Host := DNSServer; 

    RetryCount := Retries; 
    repeat 
     try 
     dec(RetryCount); 

     AIdDNSResolver.Resolve(IPAddress); 

     Break; 
     except 
     on e: Exception do 
     begin 
      if RetryCount <= 0 then 
      begin 
    //   if SameText(e.Message, RSCodeQueryName) then 
    //    Result := FALSE 
    //   else 
        raise Exception.Create(e.Message); 
      Break; 
      end; 
     end; 
     end; 
    until false; 

    if AIdDNSResolver.QueryResult.Count > 0 then 
     Result := AIdDNSResolver.QueryResult.DomainName; 
    finally 
    FreeAndNil(AIdDNSResolver); 
    end; 
end; 

但是,所有它是被查找IP地址。我想要SRVTEXT記錄,也許SPF記錄。

回答

1

TIdDNSResolver是你在找什麼。您展示的示例僅使用TIdDNSResolver支持的一小部分。您只需設置TIdDNSResolver.QueryType屬性以指定要查詢的記錄類型,然後循環訪問TIdDNSResolver.QueryResult集合以訪問單個記錄。 TIdDNSResolver支持SRVTXT記錄,例如:

var 
    DNS: TIdDNSResolver; 
    I: Integer; 
    Record: TResultRecord; 
    Txt: TTextRecord; 
    Srv: TSRVRecord; 
begin 
    DNS := TIdDNSResolver.Create(nil); 
    try 
    DNS.WaitingTime := Timeout; 
    DNS.QueryType := [qtTXT, qtService]; 
    DNS.Host := 'some.dns.server'; 

    DNS.Resolve('some.hostname'); 

    for I := 0 to DNS.QueryResult.Count -1 do 
    begin 
     Record := DNS.QueryResult[I]; 
     case Record.RecType of 
     begin 
     qtTXT: begin 
      Txt := TTextRecord(Record); 
      // use Txt.Text as needed... 
     end; 
     qtService: begin 
      Srv := TSRVRecord(Record); 
      // use Srv.OriginalName, Srv.Service, Srv.Protocol, etc as needed... 
     end; 
     else 
     // something else... 
     end; 
    end; 
    finally 
    DNS.Free; 
    end; 
end; 

TIdDNSResolver支持SPF記錄類型(碼99)在RFC 4408於2006年定義的:

本文檔定義了一個新類型爲SPF的DNS RR,代碼爲99.此類型的格式與TXT RR [RFC1035]相同。對於任何一種類型,記錄的字符內容都被編碼爲[US-ASCII]。

人們認識到,目前的做法(使用TXT記錄)並不是最優的,但它是必要的,因爲有許多常用的DNS服務器和解析器實現無法處理新的RR類型。雙記錄類型方案爲使用爲此目的保留的RR類型提供了更好的解決方案的前進途徑。

該記錄類型後來RFC 7208在2014年廢棄:

SPF記錄必須發佈爲DNS TXT(16型)資源記錄(RR)[RFC1035]只。記錄的字符內容編碼爲[US-ASCII]。 SPF實驗階段支持使用替代DNS RR類型,但已停用。

在2003年,首次被開發SPF時,新的DNS RR類型的應用的要求是相當嚴格的多比現在。此外,支持易於部署新的DNS RR類型的DNS服務器和配置系統尚未廣泛部署。因此,SPF的開發人員發現使用TXT RR類型爲SPF記錄更容易和更實用。

SPFbis工作組在審查[RFC4408]時得出結論,認爲它的雙RR類型轉換模型存在根本上的缺陷,因爲它沒有包含實施者需要檢查和檢查的常見RR類型。許多替代方案被認爲可以解決這個問題,但最終工作組得出結論認爲,在可預見的未來,向SPF RR類型的重大遷移是不太可能的,而解決這一互操作性問題的最佳解決方案是從SPF RR類型SPF版本1.請參閱[RFC6686]的附錄A獲取更多信息。

十年前SPF最初部署的情況是獨一無二的。如果開發了未重新使用現有SPF記錄的未來SPF更新,則可以使用SPF RR類型。 SPF將TXT RR類型用於結構化數據決不應成爲未來協議設計人員的先例。有關使用新的DNS RR類型的設計注意事項的進一步討論,請參見[RFC5507]。