当前位置: 首页 > Web前端 > JavaScript

关于JavaScriptIP的验证

时间:2023-03-27 13:17:13 JavaScript

关于前端项目中ip类型的判断,主要解决方案有ipv4、ipv4-ipv4、ipv4+mask、ipv6、ipv6-ipv6、ipv6+mask。已知比较简单的判断ipv4的全类型,可以借助正则化和ipv4转换成数字类型,然后比较两个数字来判断ipv4段的格式是否正确。IPV4+IPV4/掩码的正则表达式为^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)(\/(\d|[1-2]\d|3[0-2]))?$在判断ipv4段之前,先用正则表达式判断格式是否正确^((((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?))-(((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)))$之后对IPV4网段进行ToNumber处理,排除127.0.0.10-172.0.0.9的情况。ToNumber的具体实现方法是exportfunctionv4ToNumber(item){letnum=0;如果(项目==“”){返回数字;}constaNum=item.split(".");如果(aNum.length!=4){返回num;}num+=parseInt(aNum[0])<<24;num+=parseInt(aNum[1])<<16;num+=parseInt(aNum[2])<<8;num+=parseInt(aNum[3])<<0;数>>>=0;returnnum;}IPV6判断与IPV4基本一致。首先,进行IPV6或IPV6+掩码的定期验证。当情况1与实际不符时,进行IPV6-IPV6的正则校验,进行IPToNumber。否则,验证将无法通过IPV6。IPV6拆分情况(Item为传入的ipv6字符串,以fa:51:aacc::127.0.0.1为例)IPV6基本判断constparts=items.split(":");//部分是["fa","51","aacc","","127.0.0.1"]//IPv6地址至少需要2个冒号(3个部分)const_min_parts=3if(parts.length<_min_parts){returnflag,res}//添加处理后,过滤掉基本正确的ipv6格式。ipv6+ipv4格式的判断if(parts[parts.length-1].includes(".")){//解决IPv6地址以ipv4结尾的情况try{constipv4_int=v4ToNumber(parts.pop())parts.push(Number((ipv4_int>>16)&0xFFFF).toString(16))parts.push(Number(ipv4_int&0xFFFF).toString(16))}catch{returnres}}//这个操作得到ipv4地址,将ipv4地址转换为16进制数,判断缩写的IPV6格式是否正确letskip_index=nullfor(leti=0;i0;x--){ip_int<<=BigInt(16)consthextet_info=_parse_hextet(parts[parts_length-x])if(hextet_info){ip_int|=BigInt(hextet_info)}else{returnres}}returnip_int}catch{returnres}由于IPV6转Number类型得到的值比较大,所以在这个过程中将所有数值都转为BigInt类型。其中_parse_hextet函数是获取每个段落的Value具体十进制数const_HEX_DIGITS='0123456789ABCDEFabcdef'.split("");function_parse_hextet(params){if(!(issuperlist(_HEX_DIGITS,params))){returnfalse}if(params.length>4){returnfalse}return(parseInt(params,16))}//用于判断ipv6函数各段中是否有不属于0~f的值issuperlist(target,params){constnew_list=params.split("")for(constiofnew_list){constinfo=target.includes(i)if(!info)returnfalse;}returntrue}总体来说,这些代码借鉴了python中的ipaddress库,总体思路是将ipv6转为number是跟在ipaddress后面如果过程中有什么问题,请更正上面

最新推荐
猜你喜欢