0

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

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

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

所以我虽然可以从客户端获取 IP 并将其发送回服务器,例如在登录过程中。

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

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

当然,通过https我不能因为代理。但是我可以很容易地启用一个 http 服务来服务客户端 IP。

但后来我发现由于“混合活动内容”问题,浏览器会阻止来自 https 服务页面的 http 连接。

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

有什么方法可以通过该(损坏的)<img>标签读取该数据,还是我错过了使<object>元素真正被动的东西?

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

4

1 回答 1

0

最后我找到了解决方案:

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

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

...但事实是请求已发出,而我可以事先决定哪个 url。

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

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

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

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

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

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

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

于 2019-05-11T15:58:27.590 回答