【发布时间】:2010-12-12 23:17:06
【问题描述】:
今天我遇到了我的一个基于 php 的应用程序的一个非常奇怪的行为。 在系统的某个部分有一个使用 AJAX 调用来填充列表的 UI 包含后端内容的框。
现在,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。
-
所以示例场景在客户端可能如下所示: eth0 - 10.0.0.1 eth1 - 10.1.1.1 然后在服务器上你有 10.1.1.2 并且当请求从客户端而不是 10.1.1.1 通过时它显示 10.0.0.1 ?
-
正确,eth1 完成了这项工作,所以我想在 remote_addr 中有 10.1.1.1。
-
这真的很奇怪,我还没有看到这样的行为,我认为这可能与客户端网络配置有关。如果有路由,您可能需要检查网关配置等,可能关闭所有连接并一一恢复,看看问题开始发生在哪里,然后检查特定的网络采用者配置.. 只是我的 2 美分.如果两者都在不同的子网上,那么这根本不应该发生,至少我想不出它发生的合理原因。