php 获取客户端真实ip地址-kb88凯时官网登录

来自:网络
时间:2024-06-09
阅读:

php获取客户端真实ip地址,需要根据具体的服务器环境来确定使用哪种方法。目前搜索到的方法,大多是直接贴代码,没有针对不同情况作出说明,有可能导致系统被假ip骗过(ip欺骗)。

很多文章都提到“无法保证获取到的访客ip地址100%准确”,是否意味着php获取访客ip一定有漏洞可钻呢?

只要根据实际部署情况选择相对应的代码获取访客ip地址,是可以确保程序不被假ip欺骗的。

php的运行方式

php支持非常多的运行方式,例如php-cgi、php-fpm、swoole、php-cli、php-mod等。其中,php-fpm是php的fast-cgi的进程管理器。php-mod通常配合apache使用,而php-fpm通常配合nginx使用。从php5.4开始,php甚至可以以内置php服务(buid-in web server)方式运行。逐渐的,php形成了很多经典搭配,例如lamp、lnmp、lnmpa、iis php。

无论采用哪种php运行方式,分清是谁传递ip给php程序即可。这里对几种常见环境进行分析。

无代理层(php内置服务器/swoole)

由于客户端ip数据是从tcp/ip协议层传递过来的,因此在没有中间代理(客户端和服务器直连)的情况下,可以直接通过标准方法remote_addr获得与php直接通讯的ip地址。

例如$_server['remote_addr']getenv("remote_addr")

而在swoole中,可以通过$request->server['remote_addr']获得客户端ip地址。

在这种情况下,remote_addr不可以显式的伪造,获取到的是实际与服务器连接的ip地址,是可靠的。

nginx代理(nginx php-fpm / nginx swoole)

常见的lnmp方案,属于nginx反向代理。nginx与php的通讯,无论unix socket方式还是tcp socket方式,都跟nginx的header配置有关系。

proxy_http_version 1.1;
proxy_set_header x-real-ip $remote_addr;
proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
proxy_set_header host $http_host;
proxy_set_header x-nginx-proxy true;
proxy_set_header upgrade $http_upgrade;
proxy_set_header connection "upgrade";

可以在第一层nginx代理设置 proxy_set_header x-forwarded-for $remote_addr

其他层nginx代理设置proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for

这样就可以通过x-forwarded-for获取客户端真实ip地址。

如果设置了x-real-ip $remote_addr,则通过x-real-ip获取客户端ip地址。

php代码:

// php-fpm等
$_server['http_x_forwarded_for']);
// swoole
$this->http_input->header('x-real-ip');

总结来说,当有nginx代理的情况下,需要根据具体配置来选择获取的header,从而正确获取客户端ip地址,此时php中的的remote_addr可能是最后一级代理的ip地址。

apache代理(apache php_mod / apache php-fpm)

通常在apache php方案中,获取ip地址取决于apache配置信息。

绝大部分情况可以使用$_server["remote_addr"]获取到真实客户端ip地址。

如果apache上级存在nginx,那么可以在apache中使用mod_rpaf模块将客户端ip地址传递到x-forwarded-for头中。

pafheader x-forwarded-for

负载均衡/云虚拟机/serverless

在负载均衡条件下,需要查阅对应负载均衡程序的文档,来决定使用哪种方法获取真实客户端ip地址。

在大部分虚拟主机、负载均衡及无服务器中,可以通过http_client_iphttp_x_forwarded_forx-real-ip其一得知客户端ip地址。但是不建议对多种来源进行空值判断,这样容易被伪造者利用,从而实现ip欺骗。

目前并未有标准规定将客户端ip地址放入名为client_ip的环境变量,但是有不少老虚拟主机供应商这样做。新的提供商都不再使用该环境变量。网上大量的php文章中都是优先获取http_client_ip的值,因此导致网上存在大量的服务器可以被伪造ip欺骗。

可能有该漏洞的代码:


iis php

这种情况下直接使用$_server['remote_addr']方法即可。

总结

无论是哪种情况,如果用户使用匿名代理访问服务器,只能获取到代理服务器的ip地址,其ip地址仍然具有参考意义。

获取客户端真实ip地址,此事需要查阅相关资料根据具体情况选用某一个方法,而不是复制粘贴

部分方法获取到的值可能是一个数组。

不建议对获取到的ip地址进行正则过滤,有可能你获取到的是一个ipv6地址。

以上就是php 获取客户端真实ip地址的详细内容,更多关于php 获取客户端真实ip地址的资料请关注其它相关文章!

返回顶部
顶部
网站地图