标题基本上就是这么说的。
但更多信息。
这个方法有效,但是。
$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标头的完整规范是什么