2013-11-03 164 views
0

我需要检查IP地址是IPv4还是IPv6,以便相应地操作IP地址。检查IP地址类型,IPv4或IPv6

这可以通过一些简单的实现,说

<cfset ip = "2a01:bc80:1::"> 
<cfif ip does not contain ":"> 
<cfset ipV="IPv4"> 
<cfelse> 
<cfset ipV="IPv6"> 

但在另一方面,不认为这是解决这个问题的办法万无一失。 我也尝试用正则表达式重写php例子,但无法将其整理出来。

<cfset ip = "24.225.236.0"> 
<cfset checkIp = ReMatch("^[0-9a-f]{1,4}:([0-9a-f]{0,4}:){1,6}[0-9a-f]{1,4}$/", trim(ip))> 

<cfif checkIp neq 0> 
<cfset ipV="IPv4"> 
<cfelse> 
<cfset ipV="IPv6"> 
</cfif> 

<cfdump var="#ipV#"> 

什么是最好的,万无一失的方式来处理ip版本检查?

+0

为什么检查并非万无一失冒号?如果你知道你有一个IP地址,这似乎很好?你有没有冒号的IPv6地址? –

+0

我将使用CGI.REMOTE_ADDR来获取用户的IP,因此每次都应该将正确的IP传递给代码。也许我应该添加一些代码来检查IP是否有效!? – user2595617

+0

我认为IPv6总是至少有一个: – user2595617

回答

2

如果IPv6必须有一个冒号,直接包含检查的唯一小改进是不检查过去的第五个字符,因为这些段不超过四个十六进制字符?

另外,由于冒号最有可能位于第五位,因此从那里开始会更快地返回真实结果,因此使用lastIndexOf可能会稍微更有效。 (虽然差异在大多数情况下,是微不足道的。)

<cfset IpV = (ip.lastIndexOf(':',4) GTE 0) ? 'IPv6' : 'IPv4' /> 

四是因为它是一个Java方法,这就是指第五个字符的0索引的方式。如果不匹配,则返回-1,因此GTE 0部分。

其他改进与事物的IP检查方面无关,但是是三元条件运算符... Variable = BooleanCondition ? ValueIfTrue : ValueIfFalse对于这样的简单条件赋值更好。

0

我会做一个isIPv4()UDF,以便在执行检查后不必比较结果。这可能是一样容易:

<cfscript> 
function isIPv4(ip){ 
    return listlen(ip,".") EQ 4; 
} 
</cfscript> 

然后所有你需要做的是:

<CFIF isIPv4(IPAddressToTest)> 
    This is IPv4 
<CFELSE> 
    This is not IPv4 
</CFIF> 

这里是一个ColdFusion 5兼容UDF检查,看看是否每个字节是有效的。 (这是一个好地方,检查。):

http://cflib.org/udf/IsIP