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; }