閱讀526 返回首頁    go 世紀東方


各種腳本語言獲取客戶端真實IP的方法

各種語言獲取客戶端真是ip的方法

1.PHP腳本獲取客戶端真實ip的方法

整體思路:需要依次檢查HTTP_CLIENT_IP、HTTP_X_FORWARDED_FOR、REMOTE_ADDR這三個是否

存在,隻要一旦有一個存在就結束


獲取示例代碼:


function GetIP(){

if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))

$ip = getenv("HTTP_CLIENT_IP");

else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))

$ip = getenv("HTTP_X_FORWARDED_FOR");

else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))

$ip = getenv("REMOTE_ADDR");

else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))

$ip = $_SERVER['REMOTE_ADDR'];

else

$ip = "unknown";

return($ip);

}


其中對獲取ip的三個屬性HTTP_VIA、HTTP_X_FORWARDED_FOR、REMOTE_ADDR在使用代理服務器時獲取的情況

一、沒有使用代理服務器的情況:

REMOTE_ADDR = 自己的真實IP

HTTP_VIA = 沒數值或不顯示

HTTP_X_FORWARDED_FOR = 沒數值或不顯示



二、使用Transparent Proxies(透明代理)服務器的情況

REMOTE_ADDR = 最後一個代理服務器IP

HTTP_VIA = 代理服務器IP

HTTP_X_FORWARDED_FOR = 自己的真實IP


三、使用Anonymous Proxies(匿名代理)服務器的情況

REMOTE_ADDR = 最後一個代理服務器IP

HTTP_VIA = 代理服務器IP

HTTP_X_FORWARDED_FOR = 代理服務器IP


四、使用Distorting Proxies(欺騙代理)服務器的情況:

REMOTE_ADDR = 代理服務器IP

HTTP_VIA = 代理服務器IP

HTTP_X_FORWARDED_FOR = 隨機IP,經過多個代理服務器時,這個值類似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。


五、使用Elite Proxies服務器的情況

REMOTE_ADDR = 代理服務器IP

HTTP_VIA = 沒有數值或不顯示

HTTP_X_FORWARDED_FOR = 沒有數值或不顯示,經過多個代理服務器時,這個值類似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。


綜上來看,PHP獲取客戶端真實IP的方法並不是能夠百分之百成功的。


2.ASP腳本獲取客戶端真實ip的方法

獲取的思路和PHP腳本的類似,也是通過判斷HTTP_X_FORWARDED_FOR、REMOTE_ADDR來獲取的

但是由於客戶端使用代理服務器緣故,並不能保證100%能夠獲取客戶端真實ip


Private Function getIP()

  Dim strIPAddr

  If Request.ServerVariables("HTTP_X_FORWARDED_FOR") = "" OR InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), "unknown") > 0 Then

  strIPAddr = Request.ServerVariables("REMOTE_ADDR")

  ElseIf InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), ",") > 0 Then

  strIPAddr = Mid(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), 1, InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), ",")-1)

  ElseIf InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), ";") > 0 Then

  strIPAddr = Mid(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), 1, InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), ";")-1)

  Else

  strIPAddr = Request.ServerVariables("HTTP_X_FORWARDED_FOR")

  End If

  getIP = Trim(Mid(strIPAddr, 1, 30))

  End Function


3.C#獲取客戶端真實ip的方法

獲取函數的思路類似,見如下代碼:


public static string GetIPAddress()

   {

       string user_IP = string.Empty;

       if (System.Web.HttpContext.Current.Request.ServerVariables["HTTP_VIA"] != null)

       {

           if (System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null)

           {

               user_IP = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();

           }

           else

           {

               user_IP = System.Web.HttpContext.Current.Request.UserHostAddress;

           }

       }

       else

       {

           user_IP = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"].ToString();

       }

       return user_IP;


4.Java獲取客戶端真實ip的方法

package com.viathink.utils;       //需要的Java包

import javax.servlet.http.HttpServletRequest ;   //導入方法


public static String getIpAddr(HttpServletRequest request) {

String ip = request.getHeader("X-Forwarded-For");

if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

ip = request.getHeader("Proxy-Client-IP");

}

if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

ip = request.getHeader("WL-Proxy-Client-IP");

}

if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

ip = request.getHeader("HTTP_CLIENT_IP");

}

if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

ip = request.getHeader("HTTP_X_FORWARDED_FOR");

}

if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

ip = request.getRemoteAddr();

}

return ip;

}

}


5.Python獲取客戶端真實ip的方法

代碼如下:

def get_client_ip(request):

try:

   real_ip = request.META['HTTP_X_FORWARDED_FOR']

   regip = real_ip.split(",")[0]

except:

   try:

       regip = request.META['REMOTE_ADDR']

   except:

       regip = ""

return regip


最後更新:2017-01-10 21:30:56

  上一篇:go 如何重置Linux雲服務器遠程密碼
  下一篇:go 雲虛擬主機如何設置默認首頁