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

时间:2019-05-07 11:22:36

标签: node.js https http-proxy x-forwarded-for

我们已经开发了通过http / 2协议提供服务的公司NodeJS应用程序,由于服务器需要根据客户端的IP(主要是一些有关电话的数据)向客户端发送事件,因此我们需要通过客户端的IP地址来识别客户端。

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

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

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

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

经过研究,我发现的唯一选择是从服务器获取,该服务器可以告诉我到达它的位置的IP。

当然,由于代理,我不能通过https。但是我可以轻松地启用http服务,仅用于服务客户端IP。

但是后来我发现,由于“混合的活动内容”问题,浏览器阻止了HTTPS连接的HTTP连接。

我了解了一下,发现可以得到“ mixed passive content”,并且我成功地通过<img>将垃圾数据作为图像文件下载,但是当我尝试使用<object>元素即使在MDN文档中也称其为被动,我仍然遇到“混合的有效内容”阻止问题。

是否有任何方法可以通过那个<img>标签(破损的)来读取数据,还是我缺少使<object>元素真正被动的东西?

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

1 个答案:

答案 0 :(得分:0)

最后我找到了解决方法:

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

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

...但是事实是请求是发出的,我可以事先决定将其发送到哪个网址。

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

  • 将其与您的会话数据关联起来。
  • 插入一个<img>标签(可能是隐藏的),指向包含该ID的某些http网址。

您的http服务器收到下载该图像的请求后,您就可以通过 x-forwarded-for 标头(当然是信任您的代理)来读取真实IP并解决该问题它所属的活动会话。

当然,您还必须在一段时间后清除密钥,而不管其是否被使用,以免导致内存泄漏或什至被恶意使用。

最终提示::这种方法的唯一缺点是,有一天浏览器默认也会开始阻止混合的被动内容

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

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