作者 主題: 請求協助寫個判別 IP 的功能。  (閱讀 12089 次)

0 會員 與 1 訪客 正在閱讀本文。

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17466
    • 檢視個人資料
    • http://www.study-area.org
請求協助寫個判別 IP 的功能。
« 於: 2004-03-22 14:48 »
大家好﹗

我目前在做 ddns 測試,script 差不多完成了,但有一個小功能要請大家幫忙。
也就是幫忙寫一個類似如下的 php 程式,讓我可以放在 dns 的 web server 上:
http://www.chainfar.com/ip.php

以判斷 client 端的外部 IP ,
若能判斷出 proxy 代理後的 IP 更好。謝謝﹗

ozakipw

  • 憂鬱的高中生
  • ***
  • 文章數: 190
    • 檢視個人資料
請求協助寫個判別 IP 的功能。
« 回覆 #1 於: 2004-03-22 15:38 »
小弟現醜了給一段請大大試試~~~
這會抓到proxy會端的IP
但假使是透過L4 Switch+Cache Server就沒試過了

代碼: [選擇]

$usrip=getenv("REMOTE_ADDR");
$proxy=getenv("HTTP_X_FORWARDED_FOR");
if ($proxy == $usrip) $proxy='';
if ($proxy != "") list($usrip) = split(",",$proxy,3);
img]http://61.222.212.236/~test1/sing.jpg[/img]

James Wu

  • 鑽研的研究生
  • *****
  • 文章數: 683
    • 檢視個人資料
請求協助寫個判別 IP 的功能。
« 回覆 #2 於: 2004-03-22 15:44 »
丫,動作真快
那我偷貼個連結好了
http://tw2.php.net/getenv
裡頭有很多抓IP的範例

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17466
    • 檢視個人資料
    • http://www.study-area.org
請求協助寫個判別 IP 的功能。
« 回覆 #3 於: 2004-03-22 16:25 »
感謝感謝﹗

sorry,可能我說得不很清楚....
所提到的 proxy 情形,是要抓到 client 端的,而不是 proxy 的。
我後來用 james 兄給的例子來測試時,下面這段 code 可以了:
代碼: [選擇]
<?php

//Get the real client IP &#40;"bullet-proof"???&#41;

function GetIP&#40;&#41;
{
   if &
#40;getenv&#40;"HTTP_CLIENT_IP"&#41; && strcasecmp&#40;getenv&#40;"HTTP_CLIENT_IP"&#41;, "unknown
"&#41;&#41;
           
$ip = getenv&#40;"HTTP_CLIENT_IP"&#41;;
       else if &#40;getenv&#40;"
HTTP_X_FORWARDED_FOR"&#41; && strcasecmp&#40;getenv&#40;"HTTP_X_FORW
ARDED_FOR
"&#41;, "unknown"&#41;&#41;
           
$ip = getenv&#40;"HTTP_X_FORWARDED_FOR"&#41;;
       else if &#40;getenv&#40;"
REMOTE_ADDR"&#41; && strcasecmp&#40;getenv&#40;"REMOTE_ADDR"&#41;, "unkn
own
"&#41;&#41;
           
$ip = getenv&#40;"REMOTE_ADDR"&#41;;
       else if &#40;isset&#40;
$_SERVER['REMOTE_ADDR']&#41; && $_SERVER['REMOTE_ADDR'] && str
casecmp&#40;
$_SERVER['REMOTE_ADDR'], "unknown"&#41;&#41;
           
$ip = $_SERVER['REMOTE_ADDR'];
       else
           
$ip = "unknown";
   return&#40;
$ip&#41;;
}/*-------GetIP&#40;&#41;-------*/
print_r&#40;GetIP&#40;&#41;&#41;;
?>


不過,這對於 local proxy 可能會抓到 local IP ,但應付 ISP 端的 proxy 卻很有用...

若使用的是  local proxy ,下面這段或許有用:
代碼: [選擇]
<?php
   
function getIP&#40;&#41; {
       
$tmparr = array&#40;&#41;;
       
$tmparr[] = $_SERVER['REMOTE_ADDR'];
       if  &
#40;isset&#40;$_SERVER['HTTP_X_FORWARDED_FOR']&#41;&#41; {
           
$tmparr +=  explode&#40;',',$_SERVER['HTTP_X_FORWARDED_FOR']&#41;;
       
}

       return 
$tmparr;
   }

   
print_r&#40;getIP&#40;&#41;&#41;;
?>


不過,缺點是還要再過濾結果:
代碼: [選擇]
Array ( [0] => 220.130.96.21 )
不知能否幫忙改一下,只要 IP 呢?
sorry,因為 php 我不熟,暫時也沒打算去學他,請容許我偷懶一下....  ^_^

至於 ozakipw 給的那段,我不知到要如何寫,真是抱歉啦﹗

James Wu

  • 鑽研的研究生
  • *****
  • 文章數: 683
    • 檢視個人資料
請求協助寫個判別 IP 的功能。
« 回覆 #4 於: 2004-03-22 16:42 »
代碼: [選擇]

<?php
   
function getIP&#40;&#41; {
       
$IP $_SERVER['REMOTE_ADDR'];
       if  &
#40;isset&#40;$_SERVER['HTTP_X_FORWARDED_FOR']&#41;&#41; {
           
$IP +=  explode&#40;',',$_SERVER['HTTP_X_FORWARDED_FOR']&#41;;
       
}

       return 
$IP;
   }

   
print_r&#40;getIP&#40;&#41;&#41;;
?>


學長試試吧

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17466
    • 檢視個人資料
    • http://www.study-area.org
請求協助寫個判別 IP 的功能。
« 回覆 #5 於: 2004-03-22 16:53 »
報告 james 兄:
Fatal error: Unsupported operand types in /var/www/html/ipLP.php on line 5

James Wu

  • 鑽研的研究生
  • *****
  • 文章數: 683
    • 檢視個人資料
請求協助寫個判別 IP 的功能。
« 回覆 #6 於: 2004-03-22 17:03 »
呃...查不出錯誤@@
我用我老婆的機器可以run也
http://www.for-dream.idv.tw/ip.php
用的是debian,php4.3.3-4>_<
看來要等待其它學長來解答

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17466
    • 檢視個人資料
    • http://www.study-area.org
請求協助寫個判別 IP 的功能。
« 回覆 #7 於: 2004-03-22 17:08 »
okay,沒關係...
我用 grep 來過濾好了:
lynx --dump http://www.study-area.org/ipLP.php | grep -Eo '([0-9]{1,3}\.){3}[0-9]+'

謝謝啦﹗

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17466
    • 檢視個人資料
    • http://www.study-area.org
請求協助寫個判別 IP 的功能。
« 回覆 #8 於: 2004-03-22 17:56 »
最後修改如下:
代碼: [選擇]
<?php

//Get the real client IP &#40;"bullet-proof"???&#41;

function GetProxyIP&#40;&#41;
{
       if &
#40;getenv&#40;"REMOTE_ADDR"&#41; && strcasecmp&#40;getenv&#40;"REMOTE_ADDR"&#41;, "unknown"&#41;&#41;
           
$ip getenv&#40;"REMOTE_ADDR"&#41;;
       
else
           
$ip "unknown";
   return&
#40;$ip&#41;;
}/*-------GetIP&#40;&#41;-------*/


function GetClientIP&#40;&#41;
{
   if &
#40;getenv&#40;"HTTP_CLIENT_IP"&#41; && strcasecmp&#40;getenv&#40;"HTTP_CLIENT_IP"&#41;, "unknown"&#41;&#41;
           
$ip getenv&#40;"HTTP_CLIENT_IP"&#41;;
       
else if &#40;getenv&#40;"HTTP_X_FORWARDED_FOR"&#41; && strcasecmp&#40;getenv&#40;"HTTP_X_FORWARDED_FOR"&#41;, "unknown"&#41;&#41;
           
$ip getenv&#40;"HTTP_X_FORWARDED_FOR"&#41;;
       
else if &#40;getenv&#40;"REMOTE_ADDR"&#41; && strcasecmp&#40;getenv&#40;"REMOTE_ADDR"&#41;, "unknown"&#41;&#41;
           
$ip getenv&#40;"REMOTE_ADDR"&#41;;
       
else if &#40;isset&#40;$_SERVER['REMOTE_ADDR']&#41; && $_SERVER['REMOTE_ADDR'] && strcasecmp&#40;$_SERVER['REMOTE_ADDR'], "unknown"&#41;&#41;
           
$ip $_SERVER['REMOTE_ADDR'];
       else
           
$ip "unknown";
   return&
#40;$ip&#41;;
}

printf&#40;"proxy IP&#58; "&#41;;
print_r&#40;GetProxyIP&#40;&#41;&#41;;
printf&#40;"<br>\n"&#41;;
printf&#40;"client IP&#58; "&#41;;
print_r&#40;GetClientIP&#40;&#41;&#41;;

?>


哈,別見笑,我只能如此改了...  ^_^

測試:
http://www.study-area.org/ip.php

duan

  • 榮譽博士
  • 活潑的大學生
  • ***
  • 文章數: 253
    • 檢視個人資料
請求協助寫個判別 IP 的功能。
« 回覆 #9 於: 2004-03-22 23:06 »
引述: "netman"
報告 james 兄:
Fatal error: Unsupported operand types in /var/www/html/ipLP.php on line 5


line 5 是這行嗎?
$IP +=  explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);

左邊是字串, 右邊是陣列, 所以會出現 Unsupported operand types  吧?  :)
基本上最主要的兩個變數是  $REMOTE_ADDR 和 $HTTP_X_FORWARDED_FOR
而後者可能是沒有的, 所以弟這裡的用法是.

if($HTTP_X_FORWARDED_FOR){
      $proxy=explode(",",$HTTP_X_FORWARDED_FOR);
      $userip=$proxy[0];
}else{
     $userip=$REMOTE_ADDR;
}

供參考.   :)

Apache

  • 懷疑的國中生
  • **
  • 文章數: 49
    • 檢視個人資料
請求協助寫個判別 IP 的功能。
« 回覆 #10 於: 2004-06-06 13:41 »
請問一下,

若是通過兩層以上的 Proxy,是否就無法從 server side 查出真實的 client IP 了呢?

另外, 這是否是 Apache 在LogFormat 設定 log 格式裡, 沒有加入 client IP (HTTP_CLIENT_IP) 參數
而只有Remote host %h(或 Remote IP-address %a) 的原因嗎?

甫接觸 Apache,尚在摸索階段,若有謬誤,請包含指教,謝謝 !  :D

linuxcoke

  • 懷疑的國中生
  • **
  • 文章數: 34
    • 檢視個人資料
請求協助寫個判別 IP 的功能。
« 回覆 #11 於: 2004-06-19 11:26 »
我用了router, private network 是 192.168.1.0

為什麼 proxy IP and client IP 會是同一IP ?

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17466
    • 檢視個人資料
    • http://www.study-area.org
請求協助寫個判別 IP 的功能。
« 回覆 #12 於: 2004-06-19 23:25 »
若你沒用 proxy ,那就都是 "外部" ip 。