Bug->Doc #72301 [Opn]: filter_var($url, FILTER_VALIDATE_URL) does not support scheme-relative URLs

From: Date: Thu, 22 Apr 2021 11:46:43 +0000
Subject: Bug->Doc #72301 [Opn]: filter_var($url, FILTER_VALIDATE_URL) does not support scheme-relative URLs
References: 1  Groups: php.doc.bugs 
Request: Send a blank email to doc-bugs+get-18717@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=72301&edit=1

 ID:                 72301
 Updated by:         cmb@php.net
 Reported by:        ian+php at ians-net dot co dot uk
 Summary:            filter_var($url, FILTER_VALIDATE_URL) does not
                     support scheme-relative URLs
 Status:             Open
-Type:               Bug
+Type:               Documentation Problem
 Package:            Filter related
 Operating System:   irrelevant
 PHP Version:        7.0.7
 Block user comment: N
 Private report:     N

 New Comment:

This is not related to any RFC or parse_url(), but is rather
because the scheme is always required.  There was the
FILTER_FLAG_SCHEME_REQUIRED flag, but since this was implied
anyway, it is removed as of PHP 8.0.0.  I think adding a
FILTER_FLAG_SCHEME_OPTIONAL flag makes sense, and that wouldn't
affect BC.  If anybody is still interested in this, please pursue
the RFC process[1].

I'm changing this ticket to documentation issue, since the docs[2]
are misleading regarding the scheme (always required) and the host
(required except for mailto, news and file URIs).

[1] <https://wiki.php.net/rfc/howto>
[2] <https://www.php.net/manual/en/filter.filters.validate.php>


Previous Comments:
------------------------------------------------------------------------
[2016-12-22 10:18:09] yohgaki@php.net

FYI. "//example.com/" is supported by parse_url() and URL rewriter by default.

https://3v4l.org/uN3I3

There is re2c URL parser. I suppose it's not merged yet. It may be better to use new URL parser
and be consistent. Current URL rewriter uses the same internal function as parse_url(), so it will
use re2c URL parser when it is merged.

------------------------------------------------------------------------
[2016-12-22 02:22:44] ihipop+php at gmail dot com

I think a new flag should be add to obey the RFC3986,and compatible with the old behavior

------------------------------------------------------------------------
[2016-06-30 15:18:49] apokryfos84 at gmail dot com

The problem is that FILTER_VALIDATE_URL uses RFC 2396 which is older than RFC 3986. This would have
been OK if the language was consistent in the URL RFC it was using, however parse_url seems to be
using RFC3986, making the following code to behave unexpectedly. 

if (filter_var($url,FILTER_VALIDATE_URL)) {
    $parts = parse_url($url);
} 

Note: I am only assuming that parse_url uses RFC 3986 because there's a link to it in the
"see also" links of http://php.net/manual/en/function.parse-url.php

------------------------------------------------------------------------
[2016-05-31 10:07:05] derick@php.net

If this gets added, it should be done with an optional (off by default) new flag.

------------------------------------------------------------------------
[2016-05-31 09:26:53] ian+php at ians-net dot co dot uk

Description:
------------
RFC3986 allows scheme relative URLs, also termed network-path references. These are commonly used to
ensure the appropriate protocol is used to fetch the resource regardless of whether the resource is
embedded in a http or https page.

filter_var($url, FILTER_VALIDATE_URL) does not correctly validate these URLs

See also
 https://tools.ietf.org/html/rfc3986#section-4.2
 https://url.spec.whatwg.org/#syntax-url-scheme-relative

Test script:
---------------
var_dump(filter_var("//google.com/", FILTER_VALIDATE_URL));



Expected result:
----------------
bool(true)

Actual result:
--------------
bool(false)


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



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


Thread (1 message)

  • cmb@php.net
  • Unknown Message
    • cmb@php.net
« previous php.doc.bugs (#18717) next »