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



标题基本上就是这么说的。

但更多信息。

这个方法有效,但是。

$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可以更改吗?答案此处表示。但一条评论也说,它可能不是用户的真实IP地址,因为它可能被代理和其他方法隐藏。这就是为什么一般规则是不依赖于$_SERVER['REMOTE_ADDR']的安全特性。

抛开这些不谈,有没有一个curl-php方法也可以隐藏/屏蔽/更改ip?(除了上述代码之外,任何其他php方法都可以。)

有没有办法对抗有没有办法获得用户的实际真实IP

干杯!

$_SERVER['REMOTE_ADDR']是客户端用于连接到Web服务器的实际物理IP地址,通过三方TCP握手确认。没有办法通过设置简单的HTTP头来伪造这一点。您也不能让webserver/PHP以任何方式用其他东西覆盖这个值。$_SERVER['REMOTE_ADDR']是根据TCP连接信息、周期来设置的。

要想真正伪造IP地址,你必须深入实际的网络层,对网络设备/中间位置的人/代理/什么有一定程度的控制,才能真正从IP地址建立TCP连接,而不是从你建立的IP地址。

有没有办法对抗这种方法,或者有没有办法获得用户的实际真实IP?

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

如果客户端在代理后面使用浏览器,则$_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通过定义Forwarded报头来否决X-*报头,而RFC 7239则否决X-Forwarded-*报头。

你可以在上查看一些答案

  • 使用PHP获取客户端IP地址
  • X-Forwarded-Proto HTTP标头的完整规范是什么

相关内容

最新更新