客户端机器/浏览器如何处理未请求的HTTP响应?

问题描述:

想象以下:客户端机器/浏览器如何处理未请求的HTTP响应?

  • 用户前进到脚本(http://sample.org/test.php

  • 脚本将HTTP请求发送到其他页面(http://google.com/)。对于这个例子,我们会说使用curl

  • 该脚本通过CURLOPT_INTERFACE将请求的IP地址设置为用户的IP。

我已经知道请求脚本不会收到响应,因为远程主机会发送任何响应给请求中给​​出的IP地址。

我在想什么会发生这种反应?假设客户端位于具有一个外部地址的局域网中,并且发送到该IP的所有流量都由作为DHCP服务器的路由器处理,那么响应是否会回到用户的计算机?如果是这样,是否有任何方法可以确保它是由用户的浏览器处理的?如果是这样,那么浏览器如何处理这个问题呢?它会在Google中打开一个新窗口吗?

我肯定有跟进这个问题,但我很好奇在这个级别上发生了什么,在我进一步试验之前。

+0

http服务器不会发送对另一个IP地址(或在另一个TCP连接上)的响应。是什么让你觉得它呢? – nos 2010-01-17 22:51:47

+0

@nos - 我知道它不会发送到另一个IP地址。它将发送到请求中给出的IP地址。我想知道当*请求者*将IP地址更改为IP以外的IP时,发送给IP地址的响应会发生什么。 – Anthony 2010-01-17 23:18:44

  • 脚本设置请求用户的IP的IP地址,通过CURLOPT_INTERFACE。

通常情况下,这是不行的。您的ISP知道您应该拥有哪个IP地址,并且不会转发来自“虚假”IP地址的流量。

特别是,由于您只能与假IP进行单向通信(因为答案不会到达您),您将无法建立工作的TCP连接,因为TCP需要three-way handshake。因此,您将无法提交您的网络请求。

我在想什么会发生这种反应?假设客户端位于具有一个外部地址的局域网中,并且发送到该IP的所有流量都由作为DHCP服务器的路由器处理,那么响应是否会回到用户的计算机?

如果用户的电脑有一个内部的IP地址,并使用NAT,路由器将不知道哪个LAN设备转发的数据包(因为它没有看到任何传出请求,它会匹配响应)。因此,答案会被删除。

即使如果你可以得到响应到达客户端:

如果它这样做,会有什么办法,以确保它是由用户的浏览器处理?

不。如上所述,TCP请求由三次握手组成。这个握手尚未完成,所以操作系统会丢弃数据包。

CURLOPT_INTERFACE适用于分配有多个IP地址的计算机,以指定哪些地址应该用作连接的源IP。您不能用它来欺骗一些其他计算机的IP地址。很可能你会得到一个错误,或者该选项将被忽略,操作系统会自动选择一个源接口(默认行为)。

响应将在与请求相同的TCP连接上返回。

+0

是什么让你认为你不能创建一个在局域网上使用另一台机器IP的接口? – jspcal 2010-01-18 05:32:17

+0

问题是关于一个PHP脚本尝试在创建新的传出连接时欺骗任意客户端的IP,以便远程端将数据包直接发送回原始客户端而不是PHP脚本运行的主机。有可能在一个涉及局域网重复IP的人为设想的情况下发生这种情况,但在现实世界的使用情况下,它将无法工作。 – Wyzard 2010-01-18 07:48:16