我们可以用 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
可以更改吗?答案here 说NO。但是评论还说它可能不是用户的真实 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 吗?的主要内容,如果未能解决你的问题,请参考以下文章