2009-11-04 96 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

相關問題