Edit report at http://bugs.php.net/bug.php?id=50830&edit=1

 ID:                 50830
 Updated by:         [email protected]
 Reported by:        mikerushton at hotmail dot co dot uk
 Summary:            FILTER_VALIDATE_IP incorrectly validates a
                     compressed IPv4-mapped IPv6 address
-Status:             Open
+Status:             Closed
 Type:               Bug
 Package:            Filter related
 Operating System:   *
 PHP Version:        5.*, 6
-Assigned To:        
+Assigned To:        cataphract
 Block user comment: N

 New Comment:

This bug has been fixed in SVN.

Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.
 
Thank you for the report, and for helping us make PHP better.

Fixed in revision #305186 for PHP 5.3 and trunk.



http://svn.php.net/viewvc/?view=revision&revision=305186


Previous Comments:
------------------------------------------------------------------------
[2010-09-08 01:00:59] michael at squiloople dot com

RFC 5952 is only a Proposed Standard. RFC 4291 is still the authority.
And even 

if/when RFC 5952 is accepted, it is only a recommendation for (good
practice) 

representation and clearly states that "all implementations must accept
and be 

able to handle any legitimate RFC 4291 format".

------------------------------------------------------------------------
[2010-09-07 21:42:21] sob at academ dot com

Please note that RFC 4291 has been updated by RFC 5952.

------------------------------------------------------------------------
[2010-08-17 18:47:30] michael at squiloople dot com

It has come to my attention that the regular expression I provided above
uses 

RFC 5321 as the authority on IPv6 address format. This differs from RFC
4291 

however, which is the ACTUAL authority on IPv6 address format. The key 

difference between the two is that 4291 allows a double colon to
represent just 

ONE 16-bit group of zeros whereas 5321 requires that it represent at
least TWO 

groups. As such, I have provided a modified regular expression which
conforms 

with 4291 in this respect (and have also removed the unnecessary
capturing 

groups present in my earlier regex)



(?:(?:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-

9](?::|$)){8,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,6})?::(?:[a-f0-

9]{1,4}(?::[a-f0-9]{1,4}){0,6})?)))|(?:(?:(?:(?:[a-f0-9]{1,4}(?::[a-f0-

9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){6,})(?:[a-f0-9]{1,4}(?::[a-f0-

9]{1,4}){0,4})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,4}:)?)))?(?:25[0-5]|2[0-

4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?:\.(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-

9])){3}))

------------------------------------------------------------------------
[2010-02-01 15:34:13] mikerushton at hotmail dot co dot uk

An addition: here's my solution (as a regular expression):



(?:(?:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9](?

::|$)){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?

::[a-f0-9]{1,4}){0,5})?)))|(?:(?:(?:[a-f0-9]{1,4}(?::[a-f0-

9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-

9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?))?(?:(?

:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\.(?:(?:25[0-

5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))

------------------------------------------------------------------------
[2010-01-24 15:45:29] mikerushton at hotmail dot co dot uk

Description:
------------
FILTER_VALIDATE_IP validates the incorrect 0:::255.255.255.255 and does


not validate the correct 0::255.255.255.255



According to RFC 5321, the correct syntax is:



[IPv6-hex *3(":" IPv6-hex)] "::" [IPv6-hex *3(":" IPv6-hex) ":"] IPv4-

address-literal



This does not allow for three consecutive colons.

Reproduce code:
---------------
// First



filter_var('FFFF:::255.255.255.255', FILTER_VALIDATE_IP);



// Second



filter_var('FFFF::255.255.255.255', FILTER_VALIDATE_IP);

Expected result:
----------------
// First



bool(false)



// Second



string(21) 'FFFF::255.255.255.255'

Actual result:
--------------
// First



string(22) 'FFFF:::255.255.255.255'



// Second



bool(false)


------------------------------------------------------------------------



-- 
Edit this bug report at http://bugs.php.net/bug.php?id=50830&edit=1

Reply via email to