【问题标题】:Codeigniter's Session Library: How to get the correct IP Address when using ProxyCodeigniter 会话库:使用代理时如何获取正确的 IP 地址
【发布时间】:2017-05-15 18:26:36
【问题描述】:

我有一个应用程序使用 Codeigniter 3x 和 Cloudflare 添加额外的安全层。

当我使用 $_SERVER['REMOTE_ADDR'] 时,我的应用程序返回 Cloudflare 的 IP 而不是我用户的 IP,所以我总是需要使用 $_SERVER['HTTP_CF_CONNECTING_IP']

到目前为止,还好。当我在任何控制器中需要我的用户 IP 时,我会联系 $_SERVER['HTTP_CF_CONNECTING_IP']。问题是我的会话库没有这样做。 我的 ci_sessions 表中充满了 Cloudflare 的 IP。

所以我的问题可能有点宽泛,但我需要一些关于如何在不弄乱 CI 核心文件的情况下解决这个问题的想法?我注意到system/libraries/session/drivers/Session_database_driver.php 上有一个文件正在使用远程地址。如何扩展它?

干杯!

【问题讨论】:

  • 你真的在你的会话配置中使用sess_match_ip = true吗?您可能会发现 this post 很有趣。阅读有关为会话类创建自定义驱动程序here
  • 感谢您的回复@DFriend。使用此链接,我能够创建一个自定义驱动程序来覆盖它。我将在此处发布解决方案。
  • 你不应该这样做。
  • 嗨@Narf。谢谢你的评论。但为什么?我是否应该将所有 ci_sessions IP 地址保留给 Cloudflare 的 IP?我实际上并没有将它们用于任何事情(虽然不确定 CI 的核心),只是认为存储真实用户的值会更好。
  • 只有当你使用sess_match_ip 时才重要,这在 Intranet 环境之外是不可持续的,因为公共 IP 地址可能经常变化。换句话说:是的,留下 CF 的地址。

标签: codeigniter codeigniter-3 cloudflare


【解决方案1】:

因此,正如@Narf 评论的那样,ci_sessions ip_address 仅在您使用 sess_match_ip 时才重要(这是 config.php 中的设置)。并且,用他自己的话说:

这在 Intranet 环境之外是不可持续的,因为公共 IP 地址可能经常变化

因此,他的建议是在 ci_sessions 表中保留 Cloudfare 的地址。我认为最好将其留在这里以供将来参考。

但如果您真的需要创建自定义驱动程序,@DFriend 的推荐就像一个魅力。您可以在 CI 的用户指南in this section 中找到更多信息。

如果您想获取用户的 IP 用于其他目的,只需使用 $_SERVER['HTTP_CF_CONNECTING_IP'] 甚至 $this->server('HTTP_CF_CONNECTING_IP')。它对我有用。

我真的要感谢你们帮助我解决这个问题。

干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-05
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 2020-05-03
    相关资源
    最近更新 更多