繁体   English   中英

如何在 PHP 中获取客户端真实的 ip 地址?

[英]How can i get client real ip address in PHP?

我正在尝试获取我的 ip 地址。

这是代码, getClientIp()方法在内部使用了一个$_SERVER['REMOTE_ADDR']全局变量,所以$request->getClientIp()$_SERVER['REMOTE_ADDR']是一样的。

<?php

use Symfony\Component\HttpFoundation\Request;

$request = Request::createFromGlobals();
Http::response('IP address:' . $request->getClientIp())->json();

我在本地机器上的 docker 中部署了 php。 所以我向本地主机发送请求

http://localhost/api/v1/ip_address

并得到回应。

{
    "message": "IP address:172.ХХ.Х.Х", // I replaced my ip numbers with x.
    "data": []
}

但是有一个问题,我得到的ip地址和“get my ip”之类的应用程序给我的ip地址不一样。

您可以打开 Google 并输入搜索“在线查找我的 ip”或“我的 ip 是什么”,他们会给出正确的 ip,但我从 php 获得的 ip 不是。

我认为这是因为我正在向我自己的计算机发出请求,而不是向远程服务器发出请求。 任何人都可以解释为什么会发生这种情况以及我是否可以解决它?

更新:从 php 我得到了内部 ip 地址,因为它以 172.XX 开头..

您的 PHP 应用程序不知道您的公共 IP,因为它在 private.network 中。 公共 IP 由您的 ISP/路由器分配给您。 路由器 NAT 私有 IP,因此只有 1 IP 分配给您的 private.network。

“我的 IP 是什么”网站位于公共 inte.net 中,因此它看到您的公共 IP 并且不知道您的 172.xxx.xxx.xxx IP。路由器负责转换。

因此,在应用程序中,您将始终获得您的私人 IP。

如果在您的应用程序中,无论出于何种原因,您需要知道您的公共 IP,您可以拨打 ipify.org 提供的 API。

curl 'https://api.ipify.org?format=json' 

有关 NAT 如何工作的更多详细信息

在此处输入图像描述

参考:

https://www.geeksforgeeks.org.network-address-translation-nat/

“我认为这是因为我正在向我自己的计算机发出请求,而不是向远程服务器发出请求。”

你有点在这里回答了你自己的问题;)

因为你在本地运行它,所以你会看到你的私有地址 IP

如果你想找到你的公共 ip 地址,请查看这篇文章

只能获取请求来自的IP地址。

如果您向同一台计算机发出请求,那么您可能会使用环回 IP 地址,例如127.0.0.1::1

如果您向同一 LAN 上的计算机发出请求,那么您可能会在专用地址管理器中使用 IP 地址。

如果您向 Inte.net 上的计算机发出请求,那么您可能会通过提供 NAT 的路由器中继请求,并且就服务器而言,请求将来自面向 IP 地址的 Inte.net 路由器。

您无法分辨哪些 IP 地址可能已分配给计算机但未用于发出请求。

您最接近的可能是发出需要使用其他 IP 的请求。

例如,明确地指向一个 IPv4 地址和一个 IPv6 地址,然后您可以拥有一个IPv4 地址和一个 IPv6 地址(如果有的话)。 同样,在 Inte.net 上明确向 IP 地址发出请求,而不是在 local.network 上,以获取面向 Inte.net 的地址。

$_SERVER['HTTP_CLIENT_IP']$_SERVER['REMOTE_ADDR']几乎是同义词 - 我不是 PHP 专家,但它们都相当可靠并且有助于直接流量的单一用例通讯。 获取 Real-IP 是一项很重要的特殊任务,但根据您的设计以及如何根据设置正确获取 IP 地址,还需要考虑几个额外的因素。

  1. 您正在从本地计算机访问您的主机,因此将显示私有 IP 地址,因为没有识别出额外的跃点。

    一世。 当通过 inte.net 访问您的服务时,通常可以找到公共地址 IP。

  2. 您是否直接公开服务

    一世。 当你直接暴露设备时,是的,你可以直接获得 IP。 但是,您受制于自己的安全代码。

  3. 您是否在您的设计中添加了任何技术,例如反向代理系统,例如 NGINX 和/或保护技术,例如 WAF (CloudFlare / Barracuda / Azure / AWS ALB/ELB)

    一世。 您必须明白,作为客户端 IP,远程地址输入将变得不可靠,因为这些设备的远程 IP 地址代表设备,因为它面向转发流量的主机的服务。 除了使用 X-Forwarded-For 的安全编码实践注意事项之外,您还必须依赖 X-Forwarded-For ( $_SERVER['HTTP_X_FORWARDED_FOR'] ) 标头。 请记住,从威胁参与者的角度来看,这些通常是伪造的标头。 重要的是使用网络 ACL 来严格调整流量,并且只允许您信任的技术在此系统中与您的系统建立直接连接。

    二. 捕获 IP:您的主机<- log x-forwarded-for ->中间主机<-将记录 Client IP -> Remote IP

    三. 网络 ACL:您的主机<-仅允许中介->中介主机<-允许任何(与应用层的身份验证分开) ->远程 IP

然后,您必须在 Splunk 或任何需要这些关联的地方协调您的日志,以便从您接收流量的任何来源提供真实 IP。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM