IP地址檢測工具


編輯本文章

IP地址檢測工具

/*
       名字:input.js
       功能:input類型通用JS
       包括:



       --------------------------------------------------------------------------------------------
                    1--IP相關檢測及轉換函數
                    
                        1>-isIP                檢測IP是否合法                        2>-isMask                    檢測掩碼是否合法                        
                        3>-IPatol            IP字符串轉為long                    4>-isIPMaskMatch    IP與掩碼是否匹配



                        5>-isNet            是否是子網地址                        6>-isNetMaskMatch 子網與掩碼是否匹配



                        7>-isIPConflict檢測兩IP/掩碼網段沖突        8>-isNetConflict     檢測兩子網網段是否沖突
                        8>-isIPRangeVal檢測IP范圍是有效                    10>isIPRangeConflict檢測兩IP范圍是否互相包含
                        
                    2--端口相關檢測及轉換函數
                        1>-isPort                    檢測端口是否合法            2>-isPortRangeConflict    檢測兩端口范圍是否沖突
                        3>-isPortRangeVal    檢測端口范圍是否有效



                        
                    3--字符串相關



                        1>-strlen                 字符串長度(返回字符串所占字節數)
            ---------------------------------------------------------------------------------------------------
*/

/*******************************************************************
**IP相關
********************************************************************/
//將字符串形式的IP轉換成long
function IPatol(strIP)
{
    var ip=0;
    var array=strIP.split(".");
    if(array.length == 4)
    {
        ip=parseInt(ip)+parseInt(array[0])*16777216;
        ip=parseInt(ip)+parseInt(array[1])*65536;
        ip=parseInt(ip)+parseInt(array[2])*256;
        ip=parseInt(ip)+parseInt(array[3]);
    }
    return parseInt(ip);    
}

//IP是否合法,無提示,0.0.0.0被認為是不合法IP,如果IP可為0.0.0.0需在外部另加判斷



function IPntoa(dwIP)
{
    var part1 = (dwIP>>24) & 0x000000FF;
    var part2 = (dwIP>>16) & 0x000000FF;
    var part3 = (dwIP>>8) & 0x000000FF;
    var part4 = (dwIP & 0x000000FF);
    
    return (part1.toString() + "." + part2.toString() + "." + part3.toString() + "." + part4.toString());
}


function isIP(strIP)     
{
    var re=/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/; //IP正則  
  if(re.test( strIP ))    
  { 
      var n1 = parseInt(RegExp.$1);
      var n2 = parseInt(RegExp.$2);
      var n3 = parseInt(RegExp.$3);
      var n4 = parseInt(RegExp.$4);
    
      var array = strIP.split(".");
    if ((array[0].charAt(0) == '0' && n1 != 0)
        || (array[1].charAt(0) == '0' && n2 != 0)
          || (array[2].charAt(0) == '0' && n3 != 0)
        || (array[3].charAt(0) == '0' && n4 != 0))
        return false;

  
      //首位必需為1-223之間除127之外的任一數字,末位不能為0或255
      if((n1>0 && n1<224 && n1!=127) && (n2>=0 && n2<=255) && (n3>=0 && n3<=255) && ( n4>0 && n4<255))
      {
          return true;    
      }
  }
  return false;     
} 

//IP是否合法,無提示,0.0.0.0被認為是不合法IP,如果IP可為0.0.0.0需在外部另加判斷



function isIP2(strIP)     
{
    var re=/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/; //IP正則    
  if(re.test( strIP ))    
  { 
      var n1 = parseInt(RegExp.$1);
      var n2 = parseInt(RegExp.$2);
      var n3 = parseInt(RegExp.$3);
      var n4 = parseInt(RegExp.$4);
    
      var array = strIP.split(".");
    if ((array[0].charAt(0) == '0' && n1 != 0)
        || (array[1].charAt(0) == '0' && n2 != 0)
          || (array[2].charAt(0) == '0' && n3 != 0)
        || (array[3].charAt(0) == '0' && n4 != 0))
        return false;
  
      //首位必需為1-223之間除127之外的任一數字,末位不能為0或255
      if((n1>=0 && n1<=255) && (n2>=0 && n2<=255) && (n3>=0 && n3<=255) && (n4>=0 && n4<=255))
      {
          return true;    
      }
  }
  return false;     
} 

//IP驗證,有提示 
function isIP_t(strIP)
{
    if(strIP == "")
    {
        alert("請輸入IP!");
        this.focus();
        return false;    
    }
    if(!isIP(strIP))
    {
         alert("IP無效!\n\n(只能包含0-255之間的整數,\n\n且首位必須是1-223之間除127以外的數字,\n\n末位不能為0或255)");
         this.focus();
         return false;
    }
    return true;    
}

//掩碼是否合法,無提示



function isMask(strMask)
{
    //var reg=/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])(\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){3}$/; //IP正則 
    var reg=/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/;//IP正則
    if(reg.test(strMask))   
  { 
      var n1 = parseInt(RegExp.$1);
      var n2 = parseInt(RegExp.$2);
      var n3 = parseInt(RegExp.$3);
      var n4 = parseInt(RegExp.$4);
      if(isNaN(n1) || isNaN(n2) || isNaN(n3) || isNaN(n4))
      {
          return false;
      }
      if( (n1>255 || n1<0)|| (n2>255 || n2<0) || (n3>255 || n3<0) || (n4>255 || n4<0))
      {
          return false;    
      }

      var tmp = (n1*Math.pow(2,24))+(n2*Math.pow(2,16))+(n3*Math.pow(2,8))+n4;
        if(tmp < Math.pow(2,31))
        {
            return false;
        }
        else
        {
            tmp -=  Math.pow(2,31);
            //后續位必須為連續的1
            for (i = 30; i > 1; i --)
            {
                if (tmp == 0)
                {
                    break;
                }
                else if(tmp < Math.pow(2,i))
                {
                    return false;
                }
                else
                {
                    tmp -= Math.pow(2,i);
                }
            }
        }
  }
  else//!reg.match( strMask)
  {
      return false;    
  }
    return true;
}

//掩碼是否合法,0.0.0.0是合法的
function isMask2(strMask)
{
    if(!isMask(strMask))
    {
        if(strMask == "0.0.0.0")
        {
            return true;
        }
        else
            return false;
    }
    else
        return true;
}

//子網掩碼驗證,有提示
function isMask_t(strMask)
{
    if(strMask == "")
    {
        alert("請輸入掩碼!");    
        return false;
    }
    if(!isMask(strMask))
    {
        alert("請輸入有效的子網掩碼!");
        return false;    
    }
    return true;
}

//IP與掩碼匹配驗證,在執行此函數前,需已對IP及掩碼的有效性做過檢驗



function isIPMaskMatch(strIP, strMask)
{
    var nIP = IPatol(strIP);
    var nMask = IPatol(strMask);
    if (((nIP|nMask)== -1) || (((nIP|nMask)+Math.pow(2,32)) == nMask))
    {
        return false;
    }
    
    return true;
}

//驗證是否是合法的子網地址,0.0.0.0認為是不合法
function isNet(strNet)
{
    var re=/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/; //IP正則    
  if(re.test( strNet ))    
  { 
      var n1 = parseInt(RegExp.$1);
      var n2 = parseInt(RegExp.$2);
      var n3 = parseInt(RegExp.$3);
      var n4 = parseInt(RegExp.$4);    
      //首位為1-223之間除127以外的數字



      if( (n1>0 && n1<224 && n1!=127)&& (n2>=0 && n2<=255) && (n3>=0 && n3<=255) && (n4>=0 && n4<=255))
      {
          return true;    
      }
  }
  
    return false;
}

//驗證是否是合法的子網地址,0.0.0.0認為是合法



function isNet2(strNet)
{
    var re=/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/; //IP正則    
  if(re.test( strNet ))    
  { 
      var n1 = parseInt(RegExp.$1);
      var n2 = parseInt(RegExp.$2);
      var n3 = parseInt(RegExp.$3);
      var n4 = parseInt(RegExp.$4);    
      //首位為1-223之間除127以外的數字



      if( (n1>=0 && n1<224 && n1!=127)&& (n2>=0 && n2<=255) && (n3>=0 && n3<=255) && (n4>=0 && n4<=255))
      {
          return true;    
      }
  }
  
    return false;
}

//驗證子網與掩碼的匹配,在執行此函數之前,需對子網及掩碼的有效性做驗證
function isNetMaskMatch(strNet,strMask)
{
    var tmpArray=strNet.split(".");
    var tmpArray2 = strMask.split(".");    
    if(tmpArray.length != 4 || tmpArray2.length != 4)
    {
        return false;    
    }    
    for (i = 0; i < 4; i++)
    {
        tmpArray[i] = parseInt(tmpArray[i]);
        tmpArray2[i] = parseInt(tmpArray2[i]);        
        if ((tmpArray[i]|tmpArray2[i])!=tmpArray2[i])
        {
            return false;
        }
    }
    
    return true;    
}

//驗證兩IP/掩碼 網段是否沖突,在調用該函數前,需已檢測傳入參數的有效性



//true -- 沖突,false -- 未沖突



function isIPConflict( strIP1,strMask1, strIP2, strMask2)
{
    var ip1 = IPatol(strIP1);
    var mask1 = IPatol(strMask1);
    var ip2 = IPatol(strIP2);
    var mask2 = IPatol(strMask2);
    if(ip1 == 0 || mask1 == 0 || ip2 == 0 || mask2 == 0)
    {
        return false;    
    }
    
    if( (ip1&mask1&mask2) == (ip2&mask2&mask1))
    {
        return true;    //網段沖突
    }    
    return false;
}


//驗證兩子網網段是否沖突(具有包含關系),在調用該函數前,需已檢測傳入參數的有效性



//true -- 沖突,false -- 未沖突



function isNetConflict( strNet1,strMask1,strNet2,strMask2)
{
    var net1 = IPatol(strNet1);
    var mask1 = IPatol(strMask1);
    var net2 = IPatol(strNet2);
    var mask2 = IPatol(strMask2);
    if(net1 == 0 || mask1 == 0 || net2 == 0 || mask2 == 0)
    {
        return false;    
    }
    //沖突
    if( (net1&mask2) == (net2&mask1))
    {
        return true;    
    }
    
    return false;
}

//驗證IP范圍是否有效(起始IP不能大於結束IP)
function isIPRangeVal(strIPFrom,strIPTo)
{
    var ip1 = IPatol(strIPFrom);
    var ip2 = IPatol(strIPTo);
    
    if(ip1>ip2)
    {
        return false;    //起始IP大於結束IP
    }
    
    return true;    
}

//驗證IP范圍沖突(即是否具有包含關系),傳入參數的有效性在調用該函數前已驗證



function isIPRangeConflict(IPFrom1,IPTo1,IPFrom2,IPTo2)
{
    var ipf1 = IPatol(IPFrom1);
    var ipt1 = IPatol(IPTo1);
    var ipf2 = IPatol(IPFrom2);
    var ipt2 = IPatol(IPTo2);
    
    if(!((ipf1>ipt2) || (ipt1<ipf2)))
    {
        return true;    //IP范圍具有包含關系
    }
    
    return false;
}

/********************************************************************
**端口相關
*********************************************************************/
//是否是有效的端口
function isPort(strPort)
{
    var nport = parseInt(strPort); 
    if(isNaN(nport)||nport<1 ||nport>65535)
    {
        return false; //不是1-65535之間的數
    } 

    return true;    
}

//是否是有效的端口范圍
function isPortRangeVal(strPort1,strPort2)
{
    var nport1 = parseInt(strPort1);
    var nport2 = parseInt(strPort2);
    if(isNaN(nport1) || isNaN(nport2))
    {
        return false;    
    }    
    if(nport1>nport2)
    {
        return false;    //起始端口大於結束端口
    }
    return true;
}

//端口范圍是否沖突
function isPortRangeConflict(PortF1,PortT1,PortF2,PortT2)
{
    var nf1 = parseInt(PortF1);
    var nt1 = parseInt(PortT1);
    var nf2 = parseInt(PortF2);
    var nt2 = parseInt(PortT2);
    if(isNaN(nf1) || isNaN(nt1) || isNaN(nf2) || isNaN(nt2))
    {
        return false;    
    }    
    if( !( (nf1>nt2) || (nT1<nf2) ))
    {
        return false;//端口范圍沖突    
    }
    return true;
}


/********************************************************************
**字符串相關



*********************************************************************/

//取得字符串的字節數(一個漢字占三個字節)
function strlen(str)
{
    var cnt = 0;
    for( i=0; i<str.length; i++)
    {
        var value = str.charCodeAt(i);
        if( value < 0x080)
        {
            cnt += 1;
        }
        else if( value < 0x0800)
        {
            cnt += 2;
        }
        else 
        {
            cnt += 3;
        }
    }
    return cnt;
}

function isInputVilid(tmp)
{
//    var tmp = obj.value;
    if(tmp.indexOf('"')!=-1 || tmp.indexOf("<")!=-1 || tmp.indexOf(">")!=-1 
            || tmp.indexOf("'")!=-1 || tmp.indexOf("&")!=-1 
            || tmp.indexOf("%")!=-1 || tmp.indexOf("#")!=-1 || tmp.indexOf("=")!=-1 
            || tmp.indexOf("\\")!=-1 || tmp.indexOf(":")!=-1 || tmp.indexOf(",")!=-1)
    {
        return false;
    }
    return true;
}

function encryptPasswd(str)
{
    //dlan4.6 只支持https登錄, 不在需要控件加密
    //var pwdStr =  escape(str);
    //return active.EncryptUTF8(pwdStr);
    //return active.Encrypt(str);
    return str;
}

//驗證IP范圍是否有效(起始IP不能大於結束IP)
function isIPinRange(strIP, strIPFrom,strIPTo)
{
    var ip = IPatol(strIP);
    var ip1 = IPatol(strIPFrom);
    var ip2 = IPatol(strIPTo);
    
    if(ip1>ip2)
    {
        return false;    //起始IP大於結束IP
    }
    
    if (ip < ip1 || ip > ip2)
    {
        return false;
    }
    
    return true;    
}

/********************************************************************
**webagent相關
*********************************************************************/
//判斷strIpPort是否是ip:port的形式。比如1.2.3.4#1.2.3.5:4009
function isIpPort(strIpPort)
{
    if (strIpPort == null || strIpPort.length == 0)
    {
        return false;
    }
    var rex = /^([0-9.]+#){0,3}[0-9.]+:\d+$/;//判斷是否是ip1#ip2#ip3:port
    if ( ! rex.test(strIpPort) )
    {
        return false;
    }
    var arr = strIpPort.split(/:|#/);
    if ( ! isPort(arr[arr.length-1]) )
    {
        return false;
    }
    for (i = 0 ;i < arr.length-1 ; i++)
    {
        if ( ! isIP(arr[i]) )
        {
            return false;
        }
    }
    return true;
}

//判斷strDomainPort是否是 動態域名:端口 的形式
function isDomainPort(strDomainPort)
{
    if (strDomainPort == null || strDomainPort.length == 0)
    {
        return false;
    }
    rex=/^([\w-]+\.)+[a-zA-Z]+:(\d){1,5}$/
    if ( ! rex.test(strDomainPort))
    {
        return false;
    }
    var arr = strDomainPort.split(":");
    if ( ! isPort(arr[1]) )
    {
        return false;
    }
    return true;
}

//判斷strUrl是否是url形式
function isUrl(strUrl)
{
    if (strUrl == null || strUrl.length == 0)
    {
        return false;
    }
    rex=/^([\w-]+\.)+[\w]+(:(\d){1,5})?(\/[\w- .?%&=]*)+(\/)?$/
    strUrl = encodeURI(strUrl); //以防路徑名有中文
    if (rex.test(strUrl))
    {
        return true;
    }
    return false;
}

/*從strWebagt獲取正確的webagent地址
 首先自動轉換句號冒號到英文,
 然后判斷webagent是否為下面的格式,
   1> 固定IP:端口(其中固定IP支持多IP,最多支持四個IP,各IP之間以#號分隔,如:202.96.137.75#60.28.239.21:4009); 
   2> 動態域名:端口(如:www.sangfor.com.cn:4009); 
   3> 動態網頁(如:www.sangfor.com/NG4.0/test.php).
 如果不是返回null,如果是則返回轉換得到的地址
*/
function getRightWebagent(strWebagt)
{
    if (strWebagt == null || strWebagt.length == 0)
    {
        return null;
    }
    
    strWebagt = strWebagt.replace(/^http(:|:)\/\//,""); //如果http://頭 則去掉
    
    // 將"/"以前的句號冒號全部替換成英文的
    var arr = strWebagt.split("/");
    arr[0] = arr[0].replace(/:/g,":");
    arr[0] = arr[0].replace(/。/g,".");
    strWebagt = arr.join("/");
    
    if ( isIpPort(strWebagt) )
    {
        return strWebagt;
    }
    
    if ( isDomainPort(strWebagt) )
    {
        return strWebagt;
    }
    
    if ( isUrl(strWebagt) )
    {
        return strWebagt;
    }
    return null;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM