PHP是2017年获得真实用户IP地址的最准确/最安全的方式

Inf*_*ity 17 php security ip proxy reverse-proxy

通过PHP获取用户IP地址的最准确方法是什么?

我已经阅读了很多关于它的SO问题和答案,但大多数答案都是陈旧的,用户评论说这些方法是不安全的.

例如,看看这个问题(2011):如何在PHP中获取客户端IP地址?

蒂姆肯尼迪的回答包含一个建议,使用如下:

if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}
Run Code Online (Sandbox Code Playgroud)

但正如我已经阅读了很多,我已经看到使用X_FORWARDED_FOR是不安全的,因为下面的评论强调:

除非您完全了解它的作用,否则请勿使用上述代码!由于这个原因,我已经看到了MASSIVE安全漏洞.客户端可以将X-Forwarded-For或Client-IP标头设置为它想要的任意值.除非您有可信的反向代理,否则不应使用任何这些值.

由于我完全不知道它的作用,我不想承担风险.他说它不安全,但没有提供一种安全的方法来获取用户的IP地址.

我试过这个简单的$_SERVER['REMOTE_ADDR'];,但这会返回错误的IP.我已经测试了这个,我的真实IP遵循这种模式:78.57.xxx.xxx但我得到的IP地址如下:81.7.xxx.xxx

所以你有什么想法吗?

Ped*_*ito 15

简短回答:

$ip = $_SERVER['REMOTE_ADDR'];


截至2019年 $_SERVER['REMOTE_ADDR'];获取用户IP地址唯一可靠解决方案,但如果在代理服务器后面,它可能会显示错误的结果.
所有其他解决方案都意味着安全风险或可能很容易被伪造.


Nar*_*arf 9

从安全POV,没有什么,但$_SERVER['REMOTE_ADDR']可靠-这只是一个简单的事实,很遗憾.

所有带前缀的变量HTTP_实际上都是客户端发送的HTTP标头,当请求通过不同的服务器时,没有其他方法可以传输该信息.
但这当然会自动意味着客户可以欺骗那些标题.

永远不能相信客户.

除非是你...如果控制代理或负载均衡器,则可以对其进行配置,以便从原始请求中删除此类标头.
然后,只有这样,您才可以信任一个X-Client-IP标题,但实际上,没有必要在那时......您的网络服务器也可以配置为替换REMOTE_ADDR该值,整个过程对您来说变得透明.

无论我们在哪一年......对于任何与安全相关的事情 - 只有信任,情况总是如此REMOTE_ADDR.
最佳情况是仅为统计目的读取HTTP_数据,即便如此 - 确保输入至少是有效的IP地址.

  • @Infinity SQL 注入是一个完全独立的主题,您必须通过正确形成 SQL 查询来防范它,而不是担心任何一个特定值可能包含或不包含哪些字符。 (2认同)

Jer*_*son 7

你必须与你的sysops团队合作(或者如果你也戴着那顶帽子,你需要做一些研究).当您以特定方式配置网络基础结构时,将使用标头检查,其中远程请求者是您的网络设备之一而不是最终用户.

当您的Web服务器位于负载均衡器或防火墙或其他需要询问有效负载以正确处理它的设备后面时,会发生这种情况.例如,当负载均衡器终止ssl并将请求转发到没有ssl的Web服务器时.发生这种情况时,远程地址将成为负载均衡器.防火墙设备也可以执行相同的操作.

大多数情况下,设备将提供配置,以使用原始远程IP地址在请求中设置标头值.标题通常是您所期望的,但在某些情况下它可能是不同的甚至是可配置的.

而且,根据您的Web服务器配置(apache,nginx或其他),可能不支持或当前配置为支持某些自定义标头,例如公共IP标头.

重点是我们您将需要调查您的网络配置,以确保原始请求者的IP一直到您的应用程序代码以及以何种形式.


alj*_*o f 5

如果您想使用预先构建的库,可以使用Whip.

使用预制库通常会更好,因为大多数库都会被活跃的社区彻底检查过.其中一些,特别是那些已经存在很长时间的内容,内置了更多功能.

但是如果你想自己编写代码来学习这个概念,那我猜是好的.我建议将其打包为独立库并将其作为开源发布:)

编辑:我不建议在安全机制中使用远程IP,因为它们并不总是可靠的.