阅读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 云虚拟主机如何设置默认首页