如何通过代理连接识别 https 客户端



我们开发了一个通过http/2协议提供服务的企业NodeJS应用程序,我们需要通过IP地址来识别客户端,因为服务器需要根据客户端的IP向客户端发送事件(基本上是一些关于电话的数据)。

我可以通过req.connection.remoteAddress成功获取客户端 IP,但有些客户端只能通过我们的代理服务器访问服务器。

我知道x-forwarded-for标头,但这对我们不起作用,因为代理无法修改 ssl 连接中的 http 标头。

因此,我可以从客户端获取IP并发送回服务器,例如,在登录过程中。

但是,如果我没记错的话,浏览器不会向javascript提供这些信息,因此我们需要一种方法来首先获取该信息。

研究它,我发现的唯一选择是从服务器获取,它可以告诉我从哪里访问它的 IP。

当然,通过https我不能,因为代理。但是我可以轻松地启用 http 服务来为客户端 IP 提供服务。

但后来我发现浏览器会因为"混合活动内容"问题而阻止来自 https 服务的页面的 http 连接。

我读了它,我发现我可以得到"混合被动内容",并且我成功地通过<img>将垃圾数据下载为图像文件,但是当我尝试使用<object>元素做同样的事情时,即使在 MDN 文档中,我也会遇到"混合活动内容"块问题,它说它被认为是被动的。

有没有办法通过那个(损坏的)<img>标签读取该数据,或者我是否缺少一些东西来使<object>元素真正被动

实现我们目标的任何其他想法也将受到欢迎。

最后我找到了一个解决方案:

正如我所说,我能够通过放置<img>标签来执行 http 请求。

我无法做的是读取下载的数据,无论它是否是实际图像。

。但事实是,请求已经提出,我可以事先决定哪个 URL。

所以我需要做的就是为每个服务的登录屏幕生成一个随机密钥,然后:

  • 记住它与您的会话数据相关联。
  • 插入一个(可能是隐藏的)<img>标记,指向包含该 id 的某个 http 网址。

一旦您的 http 服务器收到下载该图像的请求,您就可以通过x-forwarded-for标头读取真实 IP(当然,信任您的代理)并解析它属于哪个活动会话。

当然,您还必须注意在一段时间后清除密钥,无论是否使用,以避免内存泄漏甚至恶意重复使用。

最后说明:这种方法的唯一缺点是,有一天,浏览器也可能默认开始阻止混合被动内容

出于这个原因,事实上,我选择了双重策略方法。也就是说:除了上面解释的技术之外,我还实现了一个 http 重定向器,它的作用几乎相同:它将所有请愿书重定向到根路由 ("/") 到我们的 https 应用程序。但它是通过包含先前与客户端真实 IP 关联的密钥的 POST 请求来实现的。

这样,如果有一天第一种方法停止工作,用户无论如何都可以通过http首先访问。这实际上是我们要做的。但是第一种方法,虽然它继续工作,如果用户决定从页面中为页面添加书签(这将导致其https url的书签),则可以避免出现问题。

最新更新