【发布时间】: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。这没什么大不了的(对我来说)。