是否可以伪造或劫持$_SERVER['REMOTE_ADDR']
变量的内容?
我想伪造一个请求:
$_SERVER['REMOTE_ADDR']='127.0.0.1';
我如何用PHP做到这一点?CURL可以这样做吗?
Answers:
我认为您的意思是远程伪造。简短的答案是可以。关于它多么容易的长答案取决于您要伪造它的方式。
如果您不希望收到响应,那么就像打开原始套接字到目标并伪造源IP地址一样简单。我不确定在PHP中是否真的容易实现,因为所有PHP的套接字实现都在TCP级别或更高级别。但我确信这是可能的。现在,由于您不受网络控制,因此响应不会返回给您。因此,这意味着您(绝对不能)可靠地通过伪造的TCP头创建TCP连接(因为syn-ack确实通过要求双向通信来防止这种情况)。
但是,如果您可以破坏IP所在的网关,则可以执行任何操作。因此,如果您破坏了与计算机相连的wifi路由器,则可以假装是那台计算机,而服务器不会告诉您区别所在。如果您破坏了ISP的出站路由器,则可以(至少在理论上)假装是计算机,而服务器不会告诉您区别所在。
有关更多信息,请参见以下链接:
但是,127.0.0.1
如果您实际上损害了本地计算机/服务器,则只能在TCP下伪造回送地址。那时真的重要吗?
如果您使用框架来访问此信息,请绝对确保它不检查X-HTTP-FORWARDED-FOR
标题!否则,伪造IP地址很简单。例如,如果您使用的是Zend Framework的Zend_Controller_Request_Http::getClientIp
方法,请绝对确保将其false
作为参数传递!否则,有人只需要发送HTTP标头即可:X-Http-Forwarded-For: 127.0.0.1
它们现在看来是本地的!在这种情况下,使用框架而不了解后端的工作原理确实很糟糕……
我最近写了一篇博客文章,讲述了我如何偶然发现StackOverflow应用程序中的一个漏洞。这在这里非常相关,因为它采用了与该问题正在寻找的机制非常相似的机制(尽管周围的情况有些狭窄):
远程地址不是出于礼貌而添加的,它是IP协议中用来路由程序包的,因此,如果您发送带有假地址的程序包,则不会收到响应,并且由于您正在谈论HTTP请求,它是通过TCP连接传送的,它需要几个IP数据包(和匹配的响应)来建立:
不,那是不可能的(当然,除了通过回送接口实际从同一主机发送请求之外)。
如果您通过代理浏览,则$_SERVER['REMOTE_ADDR']
可能设置为代理的IP地址而不是最终用户的IP地址。
在这种情况下,还可以使用其他标头:该页面提供了一个检查所有可能性的功能,并提供了最有可能是最终用户的地址:
http://roshanbh.com.np/2007/12/getting-real-ip-address-in-php.html
但是,如果用户使用配置错误的代理,恶意的代理或旨在匿名化最终用户的代理进行代理,则您将无法保证除标题外的任何标头 REMOTE_ADDR
(代理)。
如果您的最终用户正在通过HTTPS浏览,REMOTE_ADDR
则将始终是其IP地址;您不能通过HTTPS使用代理转发。因此,绝对确定他的地址的一种方法是让他使用HTTPS打开您的网站。
您可以将在覆盖任何物品$_SERVER
阵列,包括你提到的,在一个你的服务器; 当然,不是在别人的。
但是,它不会更改您计算机的IP地址。