2009-11-04 97 views
5

今天我遇到了一个非常奇怪的基于PHP的应用程序的行为。 在系统的某个部分,有一个UI使用AJAX调用来填充包含来自后端内容的列表 框。php/ajax REMOTE_ADDR设置为IP伪造网络适配器

现在,AJAX侦听器对所有传入请求执行安全检查,确保 只有有效的客户端IP才能获得响应。有效的IP也存储在后端。

获取客户端的IP我用普通的老式

$_SERVER['REMOTE_ADDR'] 

能够统计出的大部分客户。今天我遇到了一个安装,其中 remote_addr包含一个网络适配器的IP,该网络适配器不是执行我的应用程序的实际通信的那个IP。

周围的Googling agve我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

ķ

+1

你可以在这里提供一些关于采用者和运行应用程序的服务器的细节..我的意思是他们持有哪些IP。 – 2009-11-04 10:19:19

+0

请看到我的另外 – KB22 2009-11-04 10:25:53

+0

所以示例场景看起来像这样的客户端: eth0的 - 10.0.0.1 的eth1 - 10.1.1.1 然后在服务器u有10.1.1.2,当请求从客户端经过,而不是10.1 .1.1它显示10.0.0.1? – 2009-11-04 11:02:11

回答

4

不幸的是,你必须采取与粮食所有IP信息盐。

IP地址在请求期间通过考虑数据包和请求信息而被收集。可悲的是,这些信息很容易被欺骗,甚至是不正确的(基于大量的网络概率),不应该用于任何其他目的。

+0

Thx这个,但有什么最佳做法,你可以推荐? – KB22 2009-11-05 08:34:47

+1

您问题中的代码就是我所见过的“最佳选项”。在大多数情况下,它会捕获正确的IP。只要明白我不一定会相信结果。 – 2009-11-05 08:43:22

+1

我C并接受,但你能否推荐阅读一下关于REMOTE_ADDR等是如何由apache设置的?我非常想知道是什么导致了我的麻烦。 TIA – KB22 2009-11-05 09:29:22

相关问题