国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開發(fā) > 綜合 > 正文

真正的取真實(shí)IP地址及利弊

2024-07-21 02:29:19
字體:
供稿:網(wǎng)友

目前網(wǎng)上流行的所謂“取真實(shí)ip地址”的方法,都有bug,沒有考慮到多層透明代理的情況。

多數(shù)代碼類似:

string ipaddress = (httpcontext.current.request.servervariables["http_x_forwarded_for"]!=null 
            && httpcontext.current.request.servervariables["http_x_forwarded_for"] !=string.empty)
            ?httpcontext.current.request.servervariables["http_x_forwarded_for"]
            :httpcontext.current.request.servervariables["remote_addr"];

事實(shí)上,上面的代碼只試用與用戶只使用了1層代理,如果用戶有2層,3層http_x_forwarded_for 的值是:“本機(jī)真實(shí)ip,1層代理ip,2層代理ip,.....” ,如果這個(gè)時(shí)候你的數(shù)據(jù)中保存ip字段的長(zhǎng)度很小(15個(gè)字節(jié)),數(shù)據(jù)庫(kù)就報(bào)錯(cuò)了。

實(shí)際應(yīng)用中,因?yàn)槭褂枚鄬油该鞔淼那闆r比較少,所以這種用戶并不多。

其他應(yīng)用情況,現(xiàn)在越來越多的網(wǎng)站使用了代理加速方式,比如 新浪、sohu的新聞 都使用squid做代理方式,利用多臺(tái)服務(wù)器分流。squid本身類似透明代理,會(huì)發(fā)送“http_x_forwarded_for” ,http_x_forwarded_for 中包括客戶的ip地址,如果此時(shí)客戶已經(jīng)使用了一層透明代理,那么程序取的 “http_x_forwarded_for” 就包括兩個(gè)ip地址。(我遇到過3個(gè)ip地址的情況,4個(gè)的未遇到過)

所以取“真正”ip地址的方式,還應(yīng)該判斷  “http_x_forwarded_for”  中是否有“,”逗號(hào),或者長(zhǎng)度是否超長(zhǎng)(超過15字節(jié) xxx.xxx.xxx.xxx)。

所以代碼應(yīng)該如下:

/**//// <summary>
/// 取得客戶端真實(shí)ip。如果有代理則取第一個(gè)非內(nèi)網(wǎng)地址
/// </summary>
public static string ipaddress
{
    get
    {
        string result = string.empty;
 
        result = httpcontext.current.request.servervariables["http_x_forwarded_for"];
        if(result!=null&&result!= string.empty)
        {
            //可能有代理
            if(result.indexof(".")==-1)    //沒有“.”肯定是非ipv4格式
                result = null;
            else
            {
                if(result.indexof(",")!=-1)
                {
                    //有“,”,估計(jì)多個(gè)代理。取第一個(gè)不是內(nèi)網(wǎng)的ip。
                    result = result.replace(" ","").replace("'","");
                    string[] temparyip = result.split(",;".tochararray());
                    for(int i=0;i<temparyip.length;i++)
                    {
                        if( text.isipaddress(temparyip[i])
                            && temparyip[i].substring(0,3)!="10."
                            && temparyip[i].substring(0,7)!="192.168"
                            && temparyip[i].substring(0,7)!="172.16.")
                        {
                            return temparyip[i];    //找到不是內(nèi)網(wǎng)的地址
                        }
                    }
                }
                else if(text.isipaddress(result)) //代理即是ip格式
                    return result;
                else
                    result = null;    //代理中的內(nèi)容 非ip,取ip
            }
 
        }
 
        string ipaddress = (httpcontext.current.request.servervariables["http_x_forwarded_for"]!=null && httpcontext.current.request.servervariables["http_x_forwarded_for"] !=string.empty)?httpcontext.current.request.servervariables["http_x_forwarded_for"]:httpcontext.current.request.servervariables["remote_addr"];
        
 
 
        if (null == result || result == string.empty)
            result = httpcontext.current.request.servervariables["remote_addr"];
    
        if (result == null || result == string.empty)
            result = httpcontext.current.request.userhostaddress;
 
        return result;
    }
}

取“http_x_forwarded_for” 的弊端。

http_x_forwarded_for 是http協(xié)議中頭的一部分,不影響tcp的通訊。也就是說實(shí)際上客戶端可以發(fā)送任意內(nèi)容的 http_x_forwarded_for,以就是偽造ip。最簡(jiǎn)單的是web程序的ip記錄,本來是要記錄真實(shí)ip的,反而被“黑客”欺騙。當(dāng)你的應(yīng)用程序記錄客戶的訪問ip、拒絕或允許部分ip的訪問、錯(cuò)誤日志 都會(huì)出錯(cuò),甚至誤殺。

因此必要的安全日志應(yīng)該記錄 完整的 “http_x_forwarded_for” (至少給數(shù)據(jù)庫(kù)中的字段分配 3*15+2 個(gè)字節(jié),以記錄至少3個(gè)ip) 和 “remote_addr”。對(duì) http_x_forwarded_for 的ip格式檢查也是不可少的。

附:(text是我自定義的一個(gè)類,isipaddress是其中的一個(gè)判斷是否是ip地址格式的方法)
#region bool isipaddress(str1) 判斷是否是ip格式
/**//// <summary>
/// 判斷是否是ip地址格式 0.0.0.0
/// </summary>
/// <param name="str1">待判斷的ip地址</param>
/// <returns>true or false</returns>
public static bool isipaddress(string str1)
{
    if(str1==null||str1==string.empty||str1.length<7||str1.length>15) return false;

    string regformat = @"^/d{1,3}[/.]/d{1,3}[/.]/d{1,3}[/.]/d{1,3}$";

    regex regex = new regex(regformat,regexoptions.ignorecase );
    return regex.ismatch(str1);
}
#endregion

  • 本文來源于網(wǎng)頁(yè)設(shè)計(jì)愛好者web開發(fā)社區(qū)http://www.html.org.cn收集整理,歡迎訪問。
  • 發(fā)表評(píng)論 共有條評(píng)論
    用戶名: 密碼:
    驗(yàn)證碼: 匿名發(fā)表
    主站蜘蛛池模板: 广灵县| 南溪县| 泸州市| 荆门市| 罗甸县| 舒兰市| 呼和浩特市| 黄骅市| 厦门市| 应城市| 乃东县| 阿坝县| 南充市| 铜鼓县| 南岸区| 双桥区| 内丘县| 镇康县| 奉新县| 个旧市| 大城县| 若尔盖县| 兴国县| 班玛县| 新沂市| 井研县| 汤原县| 安远县| 甘南县| 永安市| 无锡市| 尉犁县| 榆中县| 高平市| 贺兰县| 华阴市| 萝北县| 阿城市| 正阳县| 聂拉木县| 兴和县|