在使用 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);
我对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);