【问题标题】:Get User IP address in laravel with similar method to HTTP_X_FORWARDED_FOR在 laravel 中获取用户 IP 地址,方法与 HTTP_X_FORWARDED_FOR 类似
【发布时间】:2017-01-20 01:58:40
【问题描述】:

我需要获取我的用户 IP 地址'。

我发现这篇文章How to get Client Ip Address in Laravel 5.1?

上述文章使用Request::ip();

但是,此方法返回我的服务器 IP 地址。根据我从其他来源了解到的情况,当站点是本地主机时会发生这种情况 - 但站点是托管的并且位于服务器上。

这个站点是在线的,但它可能引用localhost,因为该站点可能位于它自己的服务器上(我没有任何服务器配置经验知道这是否属实,只是猜测)。

当我连接到数据库主机时,我也使用localhost 引用,而不是像mysql.phpmyadmin.hosting.com 这样的东西作为数据库主机。因此,我的猜测是,Request::ip(); 返回服务器 ip,因为该站点以某种方式位于 localhost。

但是,如果我使用 $_SERVER['HTTP_X_FORWARDED_FOR'];我得到了正确的 IP 地址。

现在我的最后一个问题是:使用起来安全吗?还有其他方法可以使用 Laravel 函数来发出这个请求吗?

据我所知,$_SERVER['HTTP_X_FORWARDED_FOR'];可以有安全漏洞,根据How to get the client IP address in PHP?

我可以放心使用$_SERVER['HTTP_X_FORWARDED_FOR']; 吗?如果没有,我还能采取什么其他方式来安全地获取用户 IP 地址?

【问题讨论】:

  • $_SERVER['REMOTE_ADDR']$_SERVER['HTTP_X_FORWARDED_FOR'] 更可靠。
  • 您是否正在使用负载均衡器来将请求重定向到您的 Web 服务器?
  • @EliSadoff Request::ip() 使用 $_SERVER['REMOTE_ADDR']。在代理/负载平衡场景中,如 OP,连接的远程地址将是代理/负载平衡器。
  • @ceejayoz 哦,这很有道理。不幸的是,使用$_SERVER['HTTP_X_FORWARDED_FOR'] 可以轻松进行欺骗。
  • 一些主机配置使用代理。所以 REMOTE_ADDR 在这个例子中是服务器 ip。您可以使用HTTP_X_FORWARDED_FOR。这没什么大不了的(对我来说)。

标签: php laravel


【解决方案1】:

X-Forwarded-For 的风险在于用户可以自己创建标头,从而传递他们想要的任何 IP。

解决方案是仅当REMOTE_ADDR 是您受信任的代理的标头时才信任标头。有一个 Laravel package 可以让您强制执行此限制。

【讨论】:

  • 感谢您的回答,我明白了。但是,X-Forwarded-For 是否存在严重的安全漏洞?我所做的只是将 IP 地址保存在数据库中。我认为如果他们更改 IP 地址,这没什么大不了的,只是一些计数不一致,但没有什么严重的 - 但是如果这导致他们能够通过实现代码以某种方式访问​​数据库或其他严重的安全漏洞在数据库中,然后 X-Forwarded-For 根本不起作用。期待你的回答:)
  • @Patrick 只是数据完整性,据我所知。如果您不在乎用户可能会欺骗您数据库中的 IP,那么它应该是安全的。
  • 我试图通过篡改数据,使用“篡改数据”之类的东西来做你提到的事情 - 但这样做似乎更先进,只是一个简单的篡改?如果我错了,请纠正我:)
  • @Patrick 这需要做一些事情。听起来您的主机在您的服务器前面有一个代理或负载平衡器,因此尝试设置 X-Forwarded-For 将被该设备忽略。您必须通过直接访问服务器本身来绕过它。 您的代码中可能存在更细微的漏洞,因此您仍应谨慎行事 - 例如,blog.ircmaxell.com/2012/11/anatomy-of-attack-how-i-hacked.html 就是 SO 上的一个漏洞。
猜你喜欢
  • 2010-10-06
  • 2011-09-29
  • 1970-01-01
  • 2017-10-15
  • 2019-07-12
  • 2014-09-27
  • 2016-01-21
  • 2011-02-06
相关资源
最近更新 更多