2017-01-16 57 views
-5

我需要將PHP中的任何給定域解析爲其對應的IP地址。 gethostbyname似乎執行反向DNS(rDNS)並且對於獲得國內連接的IP地址(不具有直接rDNS)無用。PHP功能失敗時,如何將域名解析爲IP地址?

我有以下的,這當然不起作用:

<?php 
    if (ISSET($_POST["domain"])) { 
     require_once("/protected/db.php"); 
     echo gethostbyname($_POST["domain"]); 
    } 
    echo "Error"; 
?> 

使用dns_get_record回報Array ()並沒有出現工作作爲PHP打印Array ()當我嘗試下面的代碼from this answer:

$result = dns_get_record($_POST["domain"],DNS_ALL); 
print_r($result); 

我該怎麼做?

+0

@Machavity不提供我的問題的答案(如下所示)。 – cybermonkey

+0

它不能回答它? – Machavity

+0

@Machavity看我的編輯。也許我錯誤地使用它,然後我想我可能會混淆它通過使用本地地址,但我使用適當的公共DNS名稱作爲輸入(我''_GET''測試),所以我不知道。 – cybermonkey

回答

0

您可以簡單地執行shell_exec('nslookup ' . $_POST["domain"]);,但卻輸出將與此類似:

服務器:127.0.0.1.in.addr.arpa地址:192.168.1.254

消毒

請不要使用下面的代碼作爲 - 是的,因爲它引入了顯著SECUR這些問題可以用來消滅你的整個網絡服務器。

因此需要使用正則表達式或一系列字符串拆分來隔離IP地址。我用txt2re來幫助我,這是最後的代碼塊:

if (ISSET($_POST["domain"])) { 
    $txt=shell_exec('nslookup ' . $_POST["domain"]); 
    $re1='.*?'; # Non-greedy match on filler 
    $re2='(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?![\\d])'; # Uninteresting: ipaddress 
    $re3='.*?'; # Non-greedy match on filler 
    $re4='((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))(?![\\d])'; # IPv4 IP Address 1 

    if ($c=preg_match_all ("/".$re1.$re2.$re3.$re4."/is", $txt, $matches)) 
    { 
     $ipaddress1=$matches[1][0]; 
     echo $ipaddress1; 
    } 
} 

,其輸出的IP地址:

192.168.1.254

注意上面代碼也會解析內部IP地址。

這是在Windows 10 x64(Professional)上測試的,但沒有在Linux上測試過。 shell_exec('nslookup ' . $_POST["domain"]);在技術上應該可以在所有平臺上運行,但如上所述,如果你不小心,可以很容易地用來破壞你的系統。

除了這麼多(如果不是全部的話)網絡主機將不允許使用shell_exec,因此您需要使用您自己的網絡服務器並提供正確的安全性。如果您不知道如何在您的服務器&代碼上設置正確的安全性,請不要觸摸此代碼。

0

你可能想使用dns_get_record()

我會強烈建議對cybermonkey的解決方案,爲了shell_exec()(a)是與平臺相關的,和(b)可以有重大的安全問題。

+0

cybermonkey是該問題的作者,但。 ;) – lxg

+0

這也行不通。 – cybermonkey

+0

@lxg哈哈甚至沒有意識到哈哈 – cegfault