$ _SERVER ["REMOTE_ADDR"]提供服务器IP而不是访问者IP

Lin*_*cum 47 php

我正在尝试跟踪访问者的IP地址.使用时$_SERVER["REMOTE_ADDR"],我得到服务器的IP地址而不是访问者的IP地址.我在多个位置的多台机器上尝试了这一点,它们都产生了完全相同的IP.是否有一些PHP /服务器设置可能会影响这个?

sim*_*aun 46

REMOTE_ADDR 不可信任.

无论如何,试试

$ipAddress = $_SERVER['REMOTE_ADDR'];
if (array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER)) {
    $ipAddress = array_pop(explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']));
}
Run Code Online (Sandbox Code Playgroud)

编辑:此外,您的服务器的路由器是否启用了端口转发?有可能它正在搞乱数据包.

  • 这非常危险.例如,我的X-Forwarded-For标头总是设置为''; DROP TABLE用户; - ` (47认同)
  • 请注意,HTTP_X_FORWARDED_FOR很容易被欺骗 (9认同)
  • 定义信任.这个答案很有可能引导虚假的安全.你不应该相信它的作者;) - 开玩笑说,将这些请求标题作为用户输入处理,并清楚地了解验证和验证.这些标头高度依赖于HTTP服务器/代理设置,您应该根据它配置应用程序,否则非稳定和不正确的代码很容易被利用.请参阅原始文档(首先是PHP文档,然后是其他标题,它们来源于应用程序文档.不要盲目信任). (6认同)
  • 拒绝投票的原因:REMOTE_ADDR的内容值得信赖;HTTP_X_FORWARDED_FOR根本不能,只是请求标头中的内容。 (3认同)
  • 我使用了这个想法,发现了一个关于通过引用传递的"严格标准"错误.解决方案是首先爆炸成变量.例如:`$ explosion = explode(','$ _SERVER ['HTTP_X_FORWARDED_FOR']); $ ipAddress = array_pop($ explosion);` (2认同)
  • RE:ONOZ cmt,从 x-forwarded-for 标头中提取 IP 时,请始终检查您是否确实拥有有效的 IP 地址,$safe_ip_addr = filter_var($ip_addr, FILTER_VALIDATE_IP); if($safe_ip_addr !== FALSE){ // IP 有效 ... } (2认同)

Pek*_*ica 20

使用$ _SERVER ["REMOTE_ADDR"]时,我得到服务器的IP地址而不是访问者的IP地址.

然后你的配置出了问题,或者很奇怪.

  • 你在使用某种反向代理吗?在这种情况下,@ simshaun的建议可能会奏效.

  • 您的Web服务器配置中还有其他不寻常的东西吗?

  • 你能展示你正在使用的PHP代码吗?

  • 你能说出地址的样子吗?它是本地的还是因特网地址?


cas*_*nca 11

$_SERVER['REMOTE_ADDR']提供将请求发送到Web服务器的IP地址.这通常是访问者的地址,但在您的情况下,听起来有一种代理坐在Web服务器之前拦截请求,因此Web服务器看起来好像请求来自那里.


ham*_*ady 7

不要再查找未在预期标头中设置的IP地址.只需执行以下操作即可检查整个服务器变量,并找出适合您案例的变量:

print_r($_SERVER);
Run Code Online (Sandbox Code Playgroud)