获取客户端ip地址

(图片来源网络,侵权删除)
使用$_server超全局变量
最简单直接的方法是使用$_server超全局变量中的'remote_addr'键值来获取客户端的ip地址。
if (isset($_server['remote_addr'])) {
$ip_address = $_server['remote_addr'];
}
考虑代理服务器
当用户通过代理服务器访问时,真实的ip地址可能会被代理服务器的ip地址所替代,在这种情况下,可以通过检查$_server['http_x_forwarded_for']来尝试获取原始的ip地址。
if (isset($_server['http_x_forwarded_for']) && preg_match_all('#d{1,3}.d{1,3}.d{1,3}.d{1,3}#s', $_server['http_x_forwarded_for'], $matches)) {
foreach ($matches[0] as $x_ip) {
if (!preg_match('#^(?:(?:25[05]|2[04]d|[01]?dd).){3}(?:25[05]|2[04]d|[01]?dd)$#', $x_ip)) {
continue;
} else {
$ip_address = $x_ip;
break;
}
}
} elseif (isset($_server['remote_addr'])) {
$ip_address = $_server['remote_addr'];
}
单元表格:常用ip地址信息获取方法
| 方法 | 描述 | 代码示例 |
| remote_addr | 直接获取到的可能是代理服务器的ip | $_server['remote_addr'] |
| http_x_forwarded_for | 可能包含真实用户的ip地址(通过代理) | $_server['http_x_forwarded_for'] |
| 其他头部信息 | 其他自定义头部可能包含ip信息 | $_server['http_custom_header'] |
验证ip地址格式

(图片来源网络,侵权删除)
获取到的ip地址需要经过验证才能确保其合法性,可以使用正则表达式进行简单的ipv4地址格式校验。
function validate_ip($ip) {
return filter_var($ip, ffilter_flags::ffilter_flag_ipv4);
}
$validated_ip = validate_ip($ip_address);
if ($validated_ip === false) {
// 处理无效的ip地址情况
} else {
// 使用有效的ip地址进行后续操作
}
相关问题与解答
q1: 如果一个网站有多个域名共享同一个后端,如何区分不同域名来源的请求?
a1: 可以通过查看$_server['http_host']或$_server['server_name']来获取当前请求的域名,从而区分不同域名来源的请求。
q2: 如何防止伪造的http_x_forwarded_for头部信息?
a2: 由于http头部可以被轻易修改,所以不能完全依赖http_x_forwarded_for来获取真实的客户端ip,一种策略是检查该头部中的所有ip是否为公网ip,并采取其他安全措施如认证、限流等来提高安全性,可以配置代理服务器确保它传递正确的头部信息。

(图片来源网络,侵权删除)
来源互联网整合,作者:小编,如若转载,请注明出处:https://www.aiboce.com/ask/16374.html