我们可以用 php cURL 欺骗 $_SERVER['REMOTE_ADDR'] / 用户 ip 吗?

Posted

技术标签:

【中文标题】我们可以用 php cURL 欺骗 $_SERVER[\'REMOTE_ADDR\'] / 用户 ip 吗?【英文标题】:Can we spoof $_SERVER['REMOTE_ADDR'] / user ip with php cURL?我们可以用 php cURL 欺骗 $_SERVER['REMOTE_ADDR'] / 用户 ip 吗? 【发布时间】:2013-08-21 03:18:43 【问题描述】:

好吧,标题基本上就是这样。

但要了解更多信息。 .

此方法有效,但 . .

$ip = '1.1.1.1';
curl_setopt($handle, CURLOPT_HTTPHEADER, array("REMOTE_ADDR: $ip", "X_FORWARDED_FOR: $ip"));

它只在$_SERVER 数组上添加这两个keys

HTTP_REMOTE_ADDR HTTP_X_FORWARDED_FOR

密钥REMOTE_ADDR 仍然保持不变。

REMOTE_ADDR 可以更改吗?答案hereNO。但是评论还说它可能不是用户的真实 IP 地址,因为它可能被代理和其他方法隐藏。这就是为什么一般规则是不要依赖$_SERVER['REMOTE_ADDR'] 来获得安全功能。

除了所有这些之外,还有一种 curl php 方法可以隐藏/屏蔽/更改 ip 吗? (除了上述代码之外的任何其他 php 方法都可以。)

有没有办法反击OR有没有办法获取用户的ACTUAL REAL IP

干杯!

【问题讨论】:

如果您连接的网站检查HTTP_X_FORWARDED_FOR 并假定这是REMOTE_ADDR 上的正确IP,那么您已经成功伪造了它。然而,这取决于网站的编程方式。 【参考方案1】:

否。 $_SERVER['REMOTE_ADDR'] 是客户端用于连接网络服务器的实际物理 IP 地址,由三次 TCP 握手确认。没有办法通过设置简单的 HTTP 标头来伪造这一点。你也不能让 webserver/PHP 以任何方式用其他东西覆盖这个值。 $_SERVER['REMOTE_ADDR'] 是从 TCP 连接信息中设置的,句号。

要真正欺骗 IP 地址,您必须更深入地了解实际网络层,并对网络设备/中间位置的人员/代理/诸如此类的人进行一定程度的控制,才能真正建立 TCP 连接一个不同于您建立它的 IP 地址。

有没有办法对抗该方法或有没有办法获得用户的实际真实 IP?

没有。 “用户的实际 IP 地址”是您的网络服务器接收连接的地址,句号。没有其他地址适合您。客户端从某个 IP 连接到您的服务器,这是通过三次 TCP 握手来确认的,这是您知道此客户端的唯一地址。此客户端可能是代理或 NAT 路由器(即代理)或其他东西,您根本不知道,也不应该对您有任何影响。

【讨论】:

我觉得不相信你的回答是不对的。谢谢!【参考方案2】:

如果客户端使用代理后的浏览器,$_SERVER['REMOTE_ADDR'] 将是代理的 IP 地址。远程地址是进行连接的机器的 IP。

如果代理使用标头来指示是否代表其他机器执行连接,您可以使用这些标头来确定代理背后的浏览器的 IP。

其中一些 HTTP 标头被转换为环境变量,例如 $_SERVER['HTTP_X_FORWARDED_FOR']$_SERVER['HTTP_X_FORWARDED']$_SERVER['HTTP_FORWARDED_FOR']$_SERVER['HTTP_FORWARDED'] 您可以检查其中一些变量是否已由服务器定义并(尝试)确定代理后面的浏览器的 IP。

请注意,RFC 6648 已弃用 X-* 标头,RFC 7239 通过定义 Forwarded 标头已弃用 X-Forwarded-*

您可以在

查看一些答案 Get the client IP address using PHP What is a full specification of X-Forwarded-Proto HTTP header?

【讨论】:

以上是关于我们可以用 php cURL 欺骗 $_SERVER['REMOTE_ADDR'] / 用户 ip 吗?的主要内容,如果未能解决你的问题,请参考以下文章

php curl

如何使用 curl 欺骗referer

php+curl上传文件

用PHP加载页面

如何使用 php artisan serve 设置域名

浅析php curl_multi_*系列函数进行批量http请求