如何在 PHP 中获取客户端用户 IP 地址
“大多数情况下”,单行 PHP 脚本就足以使用 PHP 获取 IP 地址。
首先,我将展示一行 PHP 代码,然后展示一个几乎涵盖其余情况的小函数。接下来讨论了获取IP地址的隐私问题。
这篇文章有以下内容,
使用 PHP 获取 IP 地址的一行脚本。
在所有情况下获取 IP 地址的简单函数。
关于获取IP地址的隐私问题的讨论
使用 PHP 一行获取 IP 地址
<!--?php $ipAddress = $_SERVER['REMOTE_ADDR']; ?-->
$_SERVER 是一个由服务器设置的PHP 数组。该值可能尚未设置。另请注意,用户可以通过自己设置 IP 地址轻松欺骗这些标头。
使用 PHP 获取 IP 地址
以下 PHP 脚本涵盖了大部分场景并返回用户的 IP 地址。
<?php
/**
* Gets IP address.
*/
function getIpAddress()
{
$ipAddress = '';
if (! empty($_SERVER['HTTP_CLIENT_IP'])) {
// to get shared ISP IP address
$ipAddress = $_SERVER['HTTP_CLIENT_IP'];
} else if (! empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
// check for IPs passing through proxy servers
// check if multiple IP addresses are set and take the first one
$ipAddressList = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
foreach ($ipAddressList as $ip) {
if (! empty($ip)) {
// if you prefer, you can check for valid IP address here
$ipAddress = $ip;
break;
}
}
} else if (! empty($_SERVER['HTTP_X_FORWARDED'])) {
$ipAddress = $_SERVER['HTTP_X_FORWARDED'];
} else if (! empty($_SERVER['HTTP_X_CLUSTER_CLIENT_IP'])) {
$ipAddress = $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
} else if (! empty($_SERVER['HTTP_FORWARDED_FOR'])) {
$ipAddress = $_SERVER['HTTP_FORWARDED_FOR'];
} else if (! empty($_SERVER['HTTP_FORWARDED'])) {
$ipAddress = $_SERVER['HTTP_FORWARDED'];
} else if (! empty($_SERVER['REMOTE_ADDR'])) {
$ipAddress = $_SERVER['REMOTE_ADDR'];
}
return $ipAddress;
}
echo "IP Address: " . getIpAddress();
本文的其余部分是为了全面性。如果你只是想使用PHP获取IP地址,你可以到此为止。复制上面的脚本并继续您的 IP 地址之旅。
如何验证用户的IP地址
IP地址很容易被欺骗。它可以来自代理服务器后面。可以涉及类似 CloudFlare 的代理。本地主机可能返回无效的 IP 地址。因此,如果您想验证 IP 地址,请使用以下脚本。
<?php
/**
* To validate if an IP address is both a valid and does not fall within
* a private network range.
*
* @param string $ip
*/
function isValidIpAddress($ip)
{
if (filter_var($ip, FILTER_VALIDATE_IP,
FILTER_FLAG_IPV4 |
FILTER_FLAG_IPV6 |
FILTER_FLAG_NO_PRIV_RANGE |
FILTER_FLAG_NO_RES_RANGE) === false) {
return false;
}
return true;
}
获取IP地址流程图
下面的流程图解释了使用 PHP 获取 IP 地址的控制流程。
获取 CloudFlare 托管网站的用户 IP 地址
当网站使用 CloudFlare 服务托管时,$_SERVER['REMOTE_ADDR']将返回 CloudFlare 服务器的 IP 地址,而不是用户的原始 IP 地址。因此在这种情况下,您可以使用CloudFlare服务器设置的变量来获取IP地址。
我以 CloudFlare 为例。类似的服务还有很多。您需要与该服务提供商联系以了解他们正在设置哪个请求标头并相应地获取 IP 地址。
if (isset($_SERVER["HTTP_CF_CONNECTING_IP"])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
$ipAddress = $_SERVER['REMOTE_ADDR'];
}
IP地址可靠性
$_SERVER['REMOTE_ADDR']是上面变量列表中最可靠的变量。REMOTE_ADDR也可能不包含 TCP 连接的真实 IP 地址。这取决于 SAPI 配置。
如果用户位于代理服务器后面,HTTP_X_FORWARDED_FOR则会被设置。但用户可以通过设置他希望公开的 IP 地址来轻松进行欺骗。
甚至变量X-Forwarded-For或客户端 IP 也可以由用户设置为他希望的任何值。
以购物车为例。您可以根据用户所在国家/地区显示产品价格。在这种情况下,您可以使用用户的 IP 地址来确定用户所在的国家/地区。在这种情况下,获取用户 IP 地址的代码应该是万无一失的。
IP地址字段长度
当您将 IP 地址存储在数据库中时,请记住将单个 IP 的字段大小设置为 45。因为IPv6 IP地址是有可能的。IPv6 IP 地址的完整形式长度为 45 个字符。
如何获取主机的IP地址
通过主机名,我们可以使用 PHP 的内置函数获取服务器的 IP 地址gethostbyname。这将返回 IPv4 地址。
<?php
// to get IP address of a host
$ipAddress = gethostbyname('www.google.com');
echo "Google's IP Address is: " . $ipAddress;
?>
获取 Google IP 地址的输出:
谷歌的IP地址是:142.250.67.36
使用 IP 地址获取主机名
通过使用 也可以进行相反的操作gethostbyaddr()。
获取用户IP地址时的隐私问题
在某些立法中,客户的 IP 地址可以被视为私人信息。这取决于法律的土地。您永远不知道您将从哪个地理区域获得用户。
根据GDPR(第 4 条第 1 点;以及说明 49),IP 地址是个人数据。我建议通知用户并征得其同意记录 IP 地址。另外,请在您的“隐私政策”文件中明确指出。
明确说明您正在收集和记录客户端用户的 IP 地址以及这样做的原因。
结论
充分了解要获取用户 IP 地址的场景非常重要。然后了解最终用户可以轻松欺骗他的 IP 地址。第三,了解每个服务器变量,从哪里获取 IP 地址。最后但并非最不重要的一点是,在您的隐私政策中明确指出您正在获取客户端用户的 IP 地址。