【问题标题】:do browsers protect users IP address?浏览器会保护用户 IP 地址吗?
【发布时间】:2012-03-28 03:40:04
【问题描述】:

我正在用 PHP 编写代码,我想检测客户端的 IP 地址。 我一直在使用 $_SERVER['REMOTE_ADDR']。

它通常可以工作...但有时我会得到地址 127.255.255.255,而很明显,一个使用常规 Internet 连接的用户试图连接该网站。有什么原因吗?

【问题讨论】:

  • 你在运行什么网络服务器?
  • 我其实不确定,我正在使用 webhubhosting.com。
  • 您应该与他们核实他们是否使用代理或其他东西,以及为什么您可以获得广播地址 (127.255.255.255) 作为客户端的远程地址。正如这里的另一位用户所说,REMOTE_ADDR 变量由网络服务器设置,该服务器使用接收请求的 IP 地址运行您的 PHP 脚本。

标签: php mysql web


【解决方案1】:

127.255.255.255 是来自您的内部服务器的广播(环回)

如果您确定它是外部用户,您应该在您的网站上检查code injection 的可能性。

【讨论】:

  • 但为什么它对某些地址有效而对另一些地址无效?这很奇怪。
  • 您的.htaccess 文件中是否有任何使用[P] 标志的RewriteRules?您自己可能正在代理一些页面?
【解决方案2】:

问题不在于您要查找的位置。事实上,当你在mysql中使用inet_aton存储$_SERVER['REMOTE_ADDR']时,必须确保该列定义为int (11) unsigned

如果您的列是签名的int,则数据将被截断,所有大于 127.255.255.255 的 IP 地址都将按原样保存。

您需要在您的 mysql 表上运行此查询(更改表和列名):

ALTER TABLE  `stats` CHANGE `ip` `ip` INT( 11 ) UNSIGNED;

【讨论】:

    【解决方案3】:

    问题在于 ip2long 将返回一个大到 4294967295 的数字(对于 255.255.255.255),并且您的 INT MySQL 字段(如果已签名)接受最大值 2147483647(来源:http://dev.mysql.com/doc/refman/5.0/en/integer-types.html),因此任何高于 2147483647 的值将存储为 2147483647。这就是为什么您的数据库中有很多 127.255.255.255。

    我想将您的数据库列转换为 BIGINT 或无符号 INT 可以解决此问题,但请注意,ip2long() 的某些实现(我认为它是 32 位与 64 位)将返回负数,要小心.

    【讨论】:

      【解决方案4】:

      要回答标题中的问题: REMOTE_ADDR 由相应的网络服务器设置,用户不能修改(使用代理等除外)。它是在任何 HTTP 发生之前从传入的 TCP 连接确定的。

      但是,它可能会被服务器网络中的某些防火墙或代理混淆。

      另外令人困惑的是 127.255.255.255 是一个广播地址,不应该是 HTTP 连接的来源(它是 TCP,仅是单播)。

      【讨论】:

        猜你喜欢
        • 2010-10-19
        • 2019-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-20
        • 2016-12-22
        • 2015-09-07
        相关资源
        最近更新 更多