【问题标题】:Can $_SERVER['REMOTE_ADDR'] be trusted?$_SERVER['REMOTE_ADDR'] 可以信任吗?
【发布时间】:2011-08-15 15:49:42
【问题描述】:

我有一个网站,只有几个人可以访问它,所以登录的 IP 数量非常有限。登录的“管理员”提交的所有内容都将发送到取决于其 IP 地址的特定文件夹。同样,他们无法通过代理或任何方式访问该网站,因为允许的 IP 范围有限。

我可以信任 $_SERVER['REMOTE_ADDR'] 提供有效的 IP,以便日志系统 100 % 稳定和高效吗?

【问题讨论】:

  • 如果可能的话,我认为你不能在不伪造 TCP 数据包的情况下伪造 REMOTE_ADDR。与$_SERVER 中的很多东西不同,REMOTE_ADDR 不是取自 HTTP 请求标头(HTTP 请求标头很容易伪造)
  • 您可以伪造 TCP 数据包,但不能伪造带有欺骗 IP 的完整 TCP 连接握手序列,初始 SYN 数据包除外。来自服务器的 SYN+ACK 响应将发送到欺骗 IP 的系统,该系统不知道该数据包为何进来并忽略它。
  • @Marc 我不确定技术解释,但我已经看到这样做了。我在管理屏幕上有一个 IP 块。我们的一个技术团队发现了我的 IP(我在家工作)并通过伪造他的 IP 地址绕过它。
  • @Blowski:如果您可以控制路由器,则可以欺骗 IP 地址,但这仅适用于您控制的网络。
  • @Marc 但是,即使他负责网络,他如何完成三种方式的连接握手?服务器的响应永远不会到达他的网络,因为 ip 是假的。所以,我还是觉得不可能

标签: php ip


【解决方案1】:

$_SERVER['REMOTE_ADDR'] 不能由用户或通过 HTTP 修改,因此您可以信任它。

【讨论】:

  • 但是,它可能不是用户的真实 IP 地址。代理、NAT 网关等...都将隐藏原始 IP,只显示连接来自的最终混淆跳的 IP 地址。因此,您不能使用它来唯一标识用户,因为可能有成百上千的不同用户都通过同一个代理。
  • 标记是正确的。我永远不会使用 IP 地址来唯一标识任何用户。由于您通过用户的 IP 存储管理员操作,因此如果每个管理员都从同一网络访问该站点,那么他们可能具有相同的 IP 地址。这可能是您在架构中需要考虑的问题。
  • 需要注意的是,如果网络服务器(进程 not 机器)受到威胁,那么 http 服务器可能会被修补以提供虚假地址。在这个阶段,您可能需要担心更大的问题,除非它是对 http-server 代码的范围非常有限的攻击。
  • 正如我所说,我通过允许访问他们的 IP 地址来允许访问我认识的特定用户。因此,如果他们曾经使用过代理,他们就不能,因为不允许代理的 IP 访问网站(或者我会说远程管理)。而且它们位于不同的地方,因此 IP 地址不同,当我将其 IP 列入“白名单”时,可以发现它。或者,为每个管理员创建一个特定的用户名和密码是一个更好的解决方案?
  • 这真的取决于您的需求以及您认为您的 Web 应用程序将走向何方。如果它是内部的,并且您只会将特定 IP 地址列入白名单,那么您使用的方法就可以了。但是,如果您打算比这更灵活,我会使用数据库和针对唯一用户 ID 的日志项来开发身份验证解决方案。
【解决方案2】:

对于网络内的任何伪造可能给您带来真正问题的任何事情,您都不应相信远程计算机的明显 IP 地址的真实性,这是一条基本规则。

安全系统不仅向服务器验证客户端,还向客户端验证服务器(以防止冒充服务器以钓鱼登录凭据),通常使用非对称加密。

【讨论】:

    猜你喜欢
    • 2012-08-26
    • 1970-01-01
    • 2011-06-14
    • 2021-03-12
    • 2012-01-01
    • 2013-03-10
    • 2023-04-09
    • 2013-08-21
    • 2013-05-27
    相关资源
    最近更新 更多