7

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

但要了解更多信息。.

这种方法有效,但是。.

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

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

  • HTTP_REMOTE_ADDR
  • HTTP_X_FORWARDED_FOR

关键REMOTE_ADDR还是一样。

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

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

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

干杯!

4

2 回答 2

20

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

要真正欺骗 IP 地址,您必须更深入地了解实际的网络层,并对网络设备/中间位置的人/代理/其他人进行一定程度的控制,才能真正能够从 IP 地址建立 TCP 连接除了你建立它的那个。

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

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

于 2013-08-19T10:49:31.657 回答
0

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

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

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

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

您可以在以下位置查看一些答案

于 2017-08-15T17:23:54.007 回答