526
世紀東方
各種腳本語言獲取客戶端真實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