【问题标题】:Saving an IP address to DB将 IP 地址保存到数据库
【发布时间】:2011-03-04 17:56:57
【问题描述】:

我想将用户的 IP 地址保存到我的数据库中,以防万一出现任何法律问题并且我们需要追踪谁执行了哪些操作。由于我非常怀疑我是否会永远真正需要使用这些数据(好吧,也许是为了计算独特的点击或其他东西)你认为我可以将REMOTE_ADDR 转储到一个字段中吗?如果是这样,该字段的长度应该是多少? 39 个字符应该适合 IPv6 地址,不是吗?我不知道我是否会得到这些,但以防万一......

【问题讨论】:

    标签: database-design ip-address ipv6


    【解决方案1】:

    如果你碰巧在使用 Postgres,有特定的data types for network addresses

    【讨论】:

      【解决方案2】:

      在 SQL Server 中,我们将 VARBINARY[16] 用于 IPv4(4 字节)和 IPv6(16 字节)的 IP。

      但在您的情况下,如果只是为了偶尔进行人工审查而不是机器处理,只需存储字符串即可。 (是的,最多 39 个字符。)

      【讨论】:

        【解决方案3】:

        存储一些完整且明确的数据表示。当您需要查询数据时,当您弄清楚您需要对数据进行何种类型的查询时,就是当您弄清楚如何转换数据以便高效查询时。

        如果您要存储用户在任何给定用户会话中首次访问的 IP 地址,您可能会考虑对 IP 地址执行反向 DNS 查找。这将产生有关用户 ISP 的信息。如果确实出现法律问题,现在您可以获得更多信息。但由于这些查找成本很高(就花费的时间而言),您可以将其作为后台任务执行,并且可能希望仅针对初始命中执行此操作,而不是在任何给定用户会话中来自同一 IP 地址的后续命中。

        【讨论】:

          【解决方案4】:

          在 DB 字段中存储 IP 地址的最有效方法是将它们转换为整数而不是使用字符串。

          CREATE TABLE `table` (
          ...
            `ip` int(10) unsigned NOT NULL,
          ...
          

          当您提到 REMOTE_ADDR 时,我假设您将使用 PHP。您可以使用 ip2long() 将 IP 地址转换为合适的值

          sprintf('%u',ip2long($_SERVER['REMOTE_ADDR']))
          

          要转换回从数据库获取的 IP,您可以使用 long2ip()

          【讨论】:

          • Python,实际上。我认为请求变量与语言无关,因为它们与 HTTP 有关系?
          猜你喜欢
          • 1970-01-01
          • 2021-03-11
          • 2016-01-13
          • 2013-07-21
          • 2012-08-15
          • 2011-10-30
          • 2020-12-07
          • 2011-08-23
          • 1970-01-01
          相关资源
          最近更新 更多