在使用 shell_exec PHP 挖掘 IP 地址后,如何使用 whois 的 IP 地址?

How to use IP address with whois, after digging it using shell_exec PHP?

我对PHP很陌生,我决心让自己成为一个关于域信息的工具。

我在请求用户,输入域名,然后我挖掘单独的DNS记录,如A,NS等

我面临的问题是 whois 命令在使用挖掘变量时没有 grep 我需要的输出。如果我自己将 IP 值放入代码中,一切正常。

示例,何时有效:

$command = sprintf("whois %s | grep 'descr'", "141.136.44.163" );
$Host = shell_exec($command);

输出:

描述:Hostinger 国际有限公司。 描述:HOSTINGER LT

当它不起作用时:

$outputA = shell_exec("dig +short a $Domain");
$command = sprintf("whois %s | grep 'descr'", $outputA );
$Host = shell_exec($command);

输出:

基本上,whois 命令似乎是 运行 并且它有效,尽管它不再搜索 'descr'。问题是,echo $outputA 的输出和手动写入的 IP 地址是相同的。在做回声时检查了多次,它实际上是一样的。 非常感谢您的想法,我正在尝试多种不同的技术来执行命令行。

供参考,我的完整代码:

function dnsLookup() {
$Domain = $_POST['DomainName'];
echo "DNS records for domain:", $Domain;
echo nl2br("\n\n\n\n", false);
echo "NS records are:";
$outputNS = shell_exec("dig +short ns $Domain");
$outputA = shell_exec("dig +short a $Domain");
$outputMX = shell_exec("dig +short mx $Domain");
$outputTXT = shell_exec("dig +short txt $Domain");
echo "<pre>$outputNS</pre>";
echo nl2br("\n", false);
echo "A records are:";
echo "<pre>$outputA</pre>";
echo nl2br("\n", false);
echo "MX records are:";
echo "<pre>$outputMX</pre>";
echo nl2br("\n", false);
echo "TXT records are:";
echo "<pre>$outputTXT</pre>";
$Registrar = shell_exec("whois $Domain | grep 'Registrar'");
$command = sprintf("whois %s | grep 'descr'", $outputA );
$Host = shell_exec($command);
echo nl2br("\n", false);
echo "Original domain's Registrar:";
echo "<pre>$Registrar<pre>";
echo "<pre>$Host<pre>";

顺便说一句,使用post方法,为了从网站内的表单中获取域名,并且完美复制,因为上面的命令行用域名greping“注册商”效果很好。

请告诉我,为什么手动写入的 IP 地址与变量相比表现不同。

检查输出文本 - IP 和域名不同。 注册人姓名 可能不是您要查找的内容,请在查看输出后更改文本。

$ whois hostinger.com | grep "descr\|Registrant Name"
Registrant Name: GDPR Masked
$ whois 141.136.44.163 | grep 'descr'
descr:          Hostinger International Ltd.
descr:          HOSTINGER LT

此外,您需要验证和转义以保护您的服务器免受命令行注入

<?php

$ip = '141.136.44.163';
$domain = 'hostinger.com';

dnsLookup($ip);    
dnsLookup($domain);
dnsLookup('garbage');

function dnsLookup($value) {
        // whether it is an IP address or a domain name, it must have a . to separate the digits or TLD
        if (strpos($value,'.') === false) die('Bad input');

        // validate, taking either a domain name or an IP address, returning false if neither
        $lookup = filter_var($value,FILTER_VALIDATE_DOMAIN,FILTER_FLAG_HOSTNAME|FILTER_NULL_ON_FAILURE) ??
                filter_var($value,FILTER_VALIDATE_IP,FILTER_NULL_ON_FAILURE) ?? false;

        // if the $value was invalid, die
        if ($lookup === false) die('Bad input');

        // do the lookup
        $Domain = escapeshellarg($lookup);
        echo "DNS records for domain:", $Domain;
        echo nl2br("\n\n\n\n", false);
        echo "NS records are:";
        $outputNS = shell_exec("dig +short ns $Domain");
        $outputA = shell_exec("dig +short a $Domain");
        $outputMX = shell_exec("dig +short mx $Domain");
        $outputTXT = shell_exec("dig +short txt $Domain");
        echo "<pre>$outputNS</pre>";
        echo nl2br("\n", false);
        echo "A records are:";
        echo "<pre>$outputA</pre>";
        echo nl2br("\n", false);
        echo "MX records are:";
        echo "<pre>$outputMX</pre>";
        echo nl2br("\n", false);
        echo "TXT records are:";
        echo "<pre>$outputTXT</pre>";
        $Registrar = shell_exec("whois $Domain | grep 'Registrar'");
        $command = sprintf("whois %s | grep 'descr\|Registrant Name'", $outputA );
        $Host = shell_exec($command);
        echo nl2br("\n", false);
        echo "Original domain's Registrar:";
        echo "<pre>$Registrar</pre>";
        echo "<pre>$Host</pre>";
}

您可以使用 var_dump($outputA) 检查字符串的长度 ($outputA),您会发现多了一个白字符,这就是原因。

解决方案就是清理字符串:

$correctIP  = trim($outputA);