我试图在PHP中获取与域相关的DNS记录的完整列表(如果可能的话)。
我一直在搜索,相关问题的大多数答案都显示如下代码:
class BankAccount {
@Input() bankName: string;
@Input('account-id') id: string;
// this property is not bound, and won't be automatically updated by Angular
normalizedBankName: string;
}
但是,当我使用该代码检查我的某个域时,会丢失很多记录。子域名根本没有显示任何记录。
可以在PHP中获取域的DNS记录的完整列表以及任何子域的记录,而不知道这些子域是什么?
答案 0 :(得分:1)
正如我发布的那样,我建议使用Pear Net DNS2。以下是一个完整的示例:http://pastebin.com/bAriPVN9
当您进行查找时,我更愿意查看Google公共DNS(8.8.8.8),但您可能有其他偏好。以下是如何设置该示例的示例:
<?php
if($_GET['showData']){
echo "Posted: <pre>";
print_r($_GET);
echo "</pre>\n";
}
$host = trim($_GET['host']);
require_once 'Net/DNS2.php';
switch($_GET['ns']){
case "google":
$ns = array('8.8.8.8');
break;
default:
if(isset($_GET['other'])){
$ns = array($_GET['other']);
} else {
$ns = array($_GET['ns']);
}
break;
}
我的原始代码正在设置为像API一样工作。用户可以以不同的方式发出GET或POST请求并获得结果记录。这个项目没有朝这个方向发展,但你会在代码中看到一些额外的步骤。接下来,您要设置或选择您想要查找的记录类型。
if(empty($_GET['r'])){
// Set Default Record Types to lookup
$_GET['r'] = array('A', 'MX', 'SRV', 'TXT', 'CNAME', 'NS');
}
我想要A记录,邮件交换记录,服务记录,文本,圆锥记录和名称服务器记录。我从未测试过小写,但没有兴趣发现是否有效。
然后我经历了挑选我想要查找的所有子域名。由于我可能使用不同的名称服务器,所以我不想让它失去理智。如果您要求ALL或*,NS可能会忽略该请求。要求提供特定记录,它总会给你回复。
if(empty($_GET['s'])){
// Set Default Dub-Domains to lookup
$_GET['s']['a'] = array('root', 'ftp', 'list', 'mail', 'store', 'www');
$_GET['s']['m'] = array('list');
$_GET['s']['c'] = array('autodiscover');
$_GET['s']['s'] = array('_sip._tls', '_sipfederationtls._tcp');
}
现在我们可以开始迭代所有这些并收集结果。结果可以以不同的方式返回,具体取决于记录类型或资源数据元素。此外,如果查找失败,可能记录不存在,我们必须处理。因此try{} catch()
阻止。
我实际上并没有查找名为&#39; root&#39;的子域名。我将其用作第二级的占位符:php.net
与第三级域:www.php.net
。
$record_results = array();
foreach($_GET['r'] as $record){
// A Records
if($record == "A"){
if($_GET['s']['a'][0] == "root"){
if($_GET['showData']){
echo "<tr><td colspan='4'>Performing A Record lookup on $host</td></tr>\r\n";
}
try {
$result = $r->query($host, 'A');
} catch(Net_DNS2_Exception $e) {
//echo "::query() failed: ", $e->getMessage(), "\n";
if(!$suppressNoData){
printf("\t<tr><td>%s</td><td>%s</td><td>%s</td><td>%d</td></tr>\n", $host, "A", "No Data", 0);
}
continue;
}
//
// loop through the answer, printing out the A records returned.
//
foreach($result->answer as $arr) {
$data = $arr->address;
printf("\t<tr><td>%s</td><td>%s</td><td>%s</td><td>%d</td></tr>\n", $arr->name, $arr->type, $data, $arr->ttl);
$record_results[] = array(
'domain' => $arr->name,
'type' => $arr->type,
'data' => $arr->address,
'ttl' => $arr->ttl
);
}
unset($_GET['s']['a'][0]);
}
然后,我们会继续$sub
将$host
附加到{{1}},以查找我们正在查找的每个不同记录并收集详细信息。
MX和SRV记录可以返回大量不同的数据。例如,域可能有4个MX记录。因此,您将获得一个必须筛选的对象数组。我想我偶然复制/粘贴了两次代码块。
当然,您可能会付出更多努力,但却能获得正确的结果。我希望这有助于你前进。