ID:               50117
 User updated by:  crisp at xs4all dot nl
 Reported By:      crisp at xs4all dot nl
 Status:           Open
 Bug Type:         Filter related
 Operating System: windows XP
 PHP Version:      5.3.2-dev
 New Comment:

I checked the sourcecode for the IPv6 validation and being based on
tokenization instead of using regular expressions I think I can offer
some guidance. I don't know C very well, but this is how I'd do it in
PHP itself:

function validateIPv6($IP)
{
        $len = strlen($IP);
        $octets = 8;
        $compressed = false;

        $i = 0;
        $c = $IP[0];
        while ($i < $len)
        {
                if ($c == ':')
                {
                        $i++;
                        if ($i < $len)
                        {
                                $c = $IP[$i];
                                if ($c == ':')
                                {
                                        if (!$compressed)
                                        {
                                                $octets--;
                                                $compressed = true;
                                                $i++;
                                        }
                                        else
                                        {
                                                return false;
                                        }
                                }
                                elseif ($i == 1)
                                {
                                        return false;
                                }
                        }
                        else
                        {
                                return false;
                        }
                }

                if ($i < $len)
                {
                        $n = 0;

                        do
                        {
                                $c = $IP[$i];

                                if (    ($c >= '0' && $c <= '9')
                                        || ($c >= 'a' && $c <= 'f')
                                        || ($c >= 'A' && $c <= 'F')
                                )
                                {
                                        $n++;
                                        $i++;
                                }
                                elseif ($c == ':')
                                {
                                        if ($n < 1 || $n > 4)
                                                return false;

                                        break;
                                }
                                elseif ($c == '.' && validateIPv4(substr($IP, 
$i - $n)))
                                {
                                        $octets--;
                                        break;
                                }
                                else
                                {
                                        return false;
                                }
                        }
                        while ($i < $len);

                        $octets--;
                }
        }

        return ($octets == 0 || ($compressed && $octets > 0));
}

offcourse validateIPv4() should be fixed as well (not allow leading
zeros), and you might want to add early bail-outs like when the string
doesn't have any ':' characters, but I'll leave that all up to you


Previous Comments:
------------------------------------------------------------------------

[2009-11-09 20:53:02] crisp at xs4all dot nl

Using 5.3.2-dev almost the same results:

valid addresses marked as invalid:
a:b:c:d:e::1.2.3.4
::0:a:b:c:d:e:f
0:a:b:c:d:e:f::

invalid address marked as valid:
::01.02.03.04

So basically it resolves just one of the cases and is still far from
RFC-compliant

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

[2009-11-09 17:06:41] [email protected]

Please try using this snapshot:

  http://snaps.php.net/php5.3-latest.tar.gz
 
For Windows:

  http://windows.php.net/snapshots/



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

[2009-11-09 00:09:57] crisp at xs4all dot nl

Description:
------------
The following valid IPv6 addresses are being marked as 'invalid':

a:b:c:d:e::1.2.3.4
::0:a:b:c:d:e:f
0:a:b:c:d:e:f::

The following invalid IPv6 addresses are being marked as 'valid':

::01.02.03.04
0:0:0:255.255.255.255

please refer to the ABNF in
http://rfc-ref.org/RFC-TEXTS/3986/chapter11.html

Reproduce code:
---------------
function validateIPv6($IP)
{
        return filter_var($IP, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6);
}

substitute $IP with the IPv6 addresses mentioned above



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


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

Reply via email to