如何找出查看 PHP 页面的人的 ISP 提供商?
是否可以使用 PHP 来跟踪或揭示它?
如果我使用以下内容:
gethostbyaddr($_SERVER['REMOTE_ADDR']);
它返回我的 IP 地址,而不是我的主机名或 ISP。
如何找出查看 PHP 页面的人的 ISP 提供商?
是否可以使用 PHP 来跟踪或揭示它?
如果我使用以下内容:
gethostbyaddr($_SERVER['REMOTE_ADDR']);
它返回我的 IP 地址,而不是我的主机名或 ISP。
编辑:此方法不再有效,因为它现在访问的网站会阻止自动查询(以前此方法违反了网站的使用条款)。下面还有其他几个不错的 [合法!] 答案(包括我的替代方案。)
您可以从以下 PHP 编码中获得所有这些东西。,
<?php
$ip=$_SERVER['REMOTE_ADDR'];
$url=file_get_contents("http://whatismyipaddress.com/ip/$ip");
preg_match_all('/<th>(.*?)<\/th><td>(.*?)<\/td>/s',$url,$output,PREG_SET_ORDER);
$isp=$output[1][2];
$city=$output[9][2];
$state=$output[8][2];
$zipcode=$output[12][2];
$country=$output[7][2];
?>
<body>
<table align="center">
<tr><td>ISP :</td><td><?php echo $isp;?></td></tr>
<tr><td>City :</td><td><?php echo $city;?></td></tr>
<tr><td>State :</td><td><?php echo $state;?></td></tr>
<tr><td>Zipcode :</td><td><?php echo $zipcode;?></td></tr>
<tr><td>Country :</td><td><?php echo $country;?></td></tr>
</table>
</body>
这似乎是您要查找的内容,如果可能,它将尝试返回完整的主机名:
HTTP 标头中没有任何内容表明用户来自哪个ISP,因此答案是否定的,没有 PHP 内置函数可以告诉您这一点。您必须使用某种将 IP 映射到网络/ISP 的服务或库。
为什么不使用 ARIN 的 REST API。
<?php
// get IP Address
$ip=$_SERVER['REMOTE_ADDR'];
// create a new cURL resource
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, 'http://whois.arin.net/rest/ip/' . $ip);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json'));
// execute
$returnValue = curl_exec($ch);
// close cURL resource, and free up system resources
curl_close($ch);
$result = json_decode($returnValue);
echo <<<END
<pre>
Handle: {$result->net->handle->{'$'}}
Ref: {$result->net->ref->{'$'}}
Name: {$result->net->name->{'$'}}
echo "OrgRef: {$result->net->orgRef->{'@name'}}";
</pre>
END;
// eof
有时字段会发生变化,所以这是对上述帖子的改进。
<body>
<table align="center">
<?
$ip=$_SERVER['REMOTE_ADDR'];
$url=file_get_contents("http://whatismyipaddress.com/ip/$ip");
preg_match_all('/<th>(.*?)<\/th><td>(.*?)<\/td>/s',$url,$output,PREG_SET_ORDER);
for ($q=0; $q < 25; $q++) {
if ($output[$q][1]) {
if (!stripos($output[$q][2],"Blacklist")) {
echo "<tr><td>".$output[$q][1]."</td><td>".$output[$q][2]."</td></tr>";
}
}
}
?>
</table>
</body>
您不能依赖 IP 地址或主机名来了解某人正在使用的 ISP。事实上,他可能根本不使用 ISP,或者他可能通过 VPN 连接登录到他的工作地点,从那里使用另一个 VPN 或远程桌面到世界另一端的托管服务,然后从那里连接到你. 您获得的 ip 地址将来自最后一台远程机器或来自该机器后面的某个防火墙,该防火墙可能又位于其他地方。
GeoIP 将帮助您: http: //www.maxmind.com/app/locate_my_ip
有一个用于访问 geoip 数据的 php 库:http: //www.maxmind.com/app/php
但请注意,您需要将 geoip db 放在您的机器上才能使其工作,所有说明都在那里 :)
我试图纠正 Ram Kumar 的回答,但每当我编辑他们的帖子时,我都会被暂时禁止,我的更改被忽略。(至于为什么,我不知道,这是我在这个网站上所做的第一次也是唯一一次编辑。)
自他的帖子以来,由于网站更改和管理员实施基本机器人检查(检查标题),他的代码不再工作:
<?php
$IP = $_SERVER['REMOTE_ADDR'];
$User_Agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0';
$Accept = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
$Accept_Language = 'en-US,en;q=0.5';
$Referer = 'http://whatismyipaddress.com/';
$Connection = 'keep-alive';
$HTML = file_get_contents("http://whatismyipaddress.com/ip/$IP", false, stream_context_create(array('http' => array('method' => 'GET', 'header' => "User-Agent: $User_Agent\r\nAccept: $Accept\r\nAccept-Language: $Accept_Language\r\nReferer: $Referer\r\nConnection: $Connection\r\n\r\n"))));
preg_match_all('/<th>(.*?)<\/th><td>(.*?)<\/td>/s', $HTML, $Matches, PREG_SET_ORDER);
$ISP = $Matches[3][2];
$City = $Matches[11][2];
$State = $Matches[10][2];
$ZIP = $Matches[15][2];
$Country = $Matches[9][2];
?>
<body>
<table align="center">
<tr><td>ISP :</td><td><?php echo $ISP;?></td></tr>
<tr><td>City :</td><td><?php echo $City;?></td></tr>
<tr><td>State :</td><td><?php echo $State;?></td></tr>
<tr><td>Zipcode :</td><td><?php echo $ZIP;?></td></tr>
<tr><td>Country :</td><td><?php echo $Country;?></td></tr>
</table>
</body>
请注意,仅提供用户代理可能就足够了,并且很可能不需要额外的标头,我只是添加了它们以使请求看起来更真实。
如果所有这些答案都没有用,那么您可以尝试 API 方式。
1. http://extreme-ip-lookup.com/json/ [这里的IP地址]
示例: http ://extreme-ip-lookup.com/json/106.192.146.13
2. http://ip-api.com/json/ [这里的IP地址]
示例:http: //ip-api.com/json/113.14.168.85
一旦它适用于您,请不要忘记将 JSON 转换为 PHP。
您可以从 ipinfo.io 或类似服务获取此信息。
<?php
/**
* Get ip info from ipinfo.io
*
* There are other services like this, for example
* http://extreme-ip-lookup.com/json/106.192.146.13
* http://ip-api.com/json/113.14.168.85
*
* source: https://stackoverflow.com/a/54721918/3057377
*/
function getIpInfo($ip = '') {
$ipinfo = file_get_contents("https://ipinfo.io/" . $ip);
$ipinfo_json = json_decode($ipinfo, true);
return $ipinfo_json;
}
function displayIpInfo($ipinfo_json) {
var_dump($ipinfo_json);
echo <<<END
<pre>
ip : {$ipinfo_json['ip']}
city : {$ipinfo_json['city']}
region : {$ipinfo_json['region']}
country : {$ipinfo_json['country']}
loc : {$ipinfo_json['loc']}
postal : {$ipinfo_json['postal']}
org : {$ipinfo_json['org']}
</pre>
END;
}
function main() {
echo("<h1>Server IP information</h1>");
$ipinfo_json = getIpInfo();
displayIpInfo($ipinfo_json);
echo("<h1>Visitor IP information</h1>");
$visitor_ip = $_SERVER['REMOTE_ADDR'];
$ipinfo_json = getIpInfo($visitor_ip);
displayIpInfo($ipinfo_json);
}
main();
?>
我认为您需要使用一些第三方服务(可能是 Web 服务)来查找 IP 并找到服务提供商。
这将为您提供您的互联网地址。将该地址插入数据库http://arin.net/whois
一个快速的选择。(该网站每分钟最多允许拨打 50 个电话。)
$json=file_get_contents("https://extreme-ip-lookup.com/json/$ip");
extract(json_decode($json,true));
echo "ISP: $isp ($city, $region, $country)<br>";
页面底部的 API 详细信息。
<?php
$isp = geoip_isp_by_name('www.example.com');
if ($isp) {
echo 'This host IP is from ISP: ' . $isp;
}
?>
(PECL geoip >= 1.0.2)
geoip_isp_by_name — 获取 Internet 服务提供商 (ISP) 名称
这是从站点或 ip 查找 isp 的正确方法。
<?php
$isp = geoip_isp_by_name('www.example.com');
if ($isp) {
echo 'This host IP is from ISP: ' . $isp;
}
?>