今天我发现我的一个基于 php 的应用程序有一个非常奇怪的行为。 在系统的某个部分,有一个 UI 使用 AJAX 调用来填充列表 包含来自后端的内容的框。
现在,AJAX 监听器对所有传入请求执行安全检查,确保 只有有效的客户端 IP 才能得到响应。有效的 IP 也存储在后端。
为了获取客户端的 IP,我使用了普通的旧 IP
$_SERVER['REMOTE_ADDR']
这适用于大多数客户。今天我遇到了一个安装 remote_addr 包含一个网络适配器的 IP,它不是执行的那个 我的应用程序的实际通信。
谷歌搜索让我很生气 Roshan's Blog entry on the topuic :
function getRealIpAddr()
{
if (!empty($_SERVER['HTTP_CLIENT_IP'])) //check ip from share internet
{
$ip=$_SERVER['HTTP_CLIENT_IP'];
}
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))//check ip is pass from prxy
{
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}
else
{
$ip=$_SERVER['REMOTE_ADDR'];
}
return $ip;
}
遗憾的是问题仍然存在。
有没有人遇到过这类问题(实际上我不认为我发现了一个全新的问题 ^^)并且对我有解决办法的想法?
编辑:
我在
- PHP 版本 5.2.9-1
- Apache/2.2.9 (Win32)
通信是通过普通的 LAN 卡完成的。现在实际客户有几个 设备更多。 VMNet 适配器等。
我想知道客户端配置如何“干扰”Web 服务器......
TIA
K
最佳答案
不幸的是,您必须对所有 IP 信息持保留态度。
IP 地址是在请求期间通过考虑数据包和请求信息收集的。可悲的是,这些信息很容易被欺骗甚至是不正确的(基于大量的网络概率)并且不应该被用于虚荣目的之外的任何事情。
关于php/ajax REMOTE_ADDR 设置为伪造网络适配器的 IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1672827/