【问题标题】:How to identify https clients through proxy connection如何通过代理连接识别https客户端
【发布时间】:2019-09-25 01:14:33
【问题描述】:

我们开发了一个通过 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> 元素真正被动?

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

【问题讨论】:

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


    【解决方案1】:

    终于找到了解决办法:

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

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

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

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-04-23
      • 1970-01-01
      • 1970-01-01
      • 2019-09-05
      • 2011-01-27
      • 1970-01-01
      • 2019-05-25
      • 2011-11-02
      • 2011-04-28
      相关资源
      最近更新 更多