<cfset sLocal = StructNew() />
<cfparam name="ip" default="">
<cfset objIP = createObject("java","coldfusion.util.IPAddressUtils") />
<h3>Enter a ip (or not :) ). Try 0.1.1.1, 0.0.0.0, 255.255.255.255, 192.168.0.0, 127.0.0.1, etc.</h3>
<h3>Currently <cfdump var="ip = #ip#"/></h3>
<cfform action="#cgi.SCRIPT_NAME#" format="html" method="post" name="myform">
<p>username: <cfinput name="ip" value="#ip#" required="true" validate="NOBLANKS" ></p>
<p><input type="submit"></p>
</cfform>
<cfif len(trim(ip))>
<cfset myIP = trim(ip) />
<p>Check using isIP UDF: <cfdump var="#isIP(myIP)#" /></p>
<p>Check using validIPAddress: <cfdump var="#validIpAddress(myIP)#" /></p>
<p>Check using Internal CF:
<ul>
<li>validateIPAdress: <cfdump var = "#objIp.validateIPAdress(myIP)#"></li>
<li>validateIPv4Address: <cfdump var = "#objIp.validateIPv4Address(myIP)#"></li>
<li>validateIPv6Address: <cfdump var = "#objIp.validateIPv6Address(myIP)#"></li>
</ul>
</p>
<p>Using Joseph's UDF: <cfdump var="#isIPV4(myIP)#" /></p>
</cfif>
<cfscript>
/**
* Returns TRUE if the string is a valid IP address.
*
* @param string String to be checked.
* @return Returns a boolean.
* @author Nathan Dintenfass (nathan@changemedia.com)
* @version 1, July 17, 2001
*/
function isIP(ip){
var ii = 1;
//make sure it is a '.' delimited list 4 long
if(listlen(ip,".") is not 4) return false;
//make sure each item is a number between 1 and 255
for(ii = 1;ii lte 4;ii = ii + 1){
if(not isnumeric(listgetat(ip,ii,".")) OR listgetat(ip,ii,".") GT 255 OR listgetat(ip,ii,".") LT 0) return false;
}
//check for the special cases of 255.255.255.255 or 0.0.0.0, which is not really valid
if(ip is "255.255.255.255" OR IP is "0.0.0.0") return false;
return true;
}
</cfscript>
<cffunction name="validIpAddress" access="public" output="false" returntype="boolean" hint="returns T/F based on private rules for valid Ip address">
<cfargument name="theIpAddress" type="string" required="false" default="" hint=""/>
<cfset var pattern="^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)">
<cfset var pattern2 = "^(10)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)">
<cfset var pattern3 = "^(172)\.(1[6-9]|2[0-9]|3[0-1])\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)">
<cfset var pattern4 = "^(192)\.(168)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)">
<cfif !REFindNoCase(pattern,arguments.theIpAddress)>
<cfreturn false />
</cfif>
<cfif !len(trim(arguments.theIpAddress))>
<cfreturn false />
</cfif>
<cfif arguments.theIpAddress eq "0.0.0.0" or arguments.theIpAddress eq "127.0.0.1" or arguments.theIpAddress eq "255.255.255.255">
<cfreturn false />
</cfif>
<cfif REFindNoCase(pattern2,arguments.theIpAddress)>
<cfreturn false />
</cfif>
<cfif REFindNoCase(pattern3,arguments.theIpAddress)>
<cfreturn false />
</cfif>
<cfif REFindNoCase(pattern4,arguments.theIpAddress)>
<cfreturn false />
</cfif>
<cfreturn true />
</cffunction>
<!--- Written by Joseph Lamoree. Modified by Sami Hoda. --->
<cffunction name="isIPV4" returntype="boolean" access="public" output="false">
<cfargument name="ip" type="string" required="true"/>
<cfset var ba = arrayNew(1)/>
<cfset var b = ""/>
<cfif reFind("[^0-9\.]", trim(arguments.ip)) gt 0>
<cfreturn false/>
</cfif>
<cfset ba = listToArray(trim(arguments.ip), ".")/>
<!--- Should have four bytes --->
<cfif not arrayLen(ba) eq 4>
<cfreturn false/>
</cfif>
<!--- First and last bytes should be non-zero --->
<cfif val(ba[1]) eq 0 or val(ba[4]) eq 0>
<cfreturn false/>
</cfif>
<!--- Not all bytes should be 255 --->
<cfif (val(ba[1]) eq 255) AND (val(ba[2]) eq 255) AND (val(ba[3]) eq 255) AND (val(ba[4]) eq 255) >
<cfreturn false/>
</cfif>
<cfloop array="#ba#" index="b">
<!--- No bytes should have leading zeros --->
<cfif len(b) gt 1 and left(b, 1) eq 0>
<cfreturn false/>
</cfif>
<!--- No bytes should be greater than 255 --->
<cfif val(b) gt 255>
<cfreturn false/>
</cfif>
</cfloop>
<cfreturn true/>
</cffunction>