2017-07-21 30 views
0

我々はFILTER_VALIDATE_URLflagsfilter_vars()を使用することができます。FILTER_VALIDATE_URLにFILTER_FLAG_SCHEME_REQUIREDフラグとFILTER_FLAG_HOST_REQUIREDフラグを使用するとは何ですか?

FILTER_FLAG_SCHEME_REQUIRED 
FILTER_FLAG_HOST_REQUIRED 
FILTER_FLAG_PATH_REQUIRED 
FILTER_FLAG_QUERY_REQUIRED 

FILTER_VALIDATE_URLRFC 2396によれば、内部parse_url()を使用して、スキーム(プロトコル)とホスト部分を必要とするURLとして値を検証します。

私は、このようfilter_varsを使用することができますaswellパスとクエリ部分を確認したい場合:

filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED | FILTER_FLAG_QUERY_REQUIRED); 

しかしFILTER_FLAG_SCHEME_REQUIREDFILTER_FLAG_HOST_REQUIREDフラグの使用は何ですか?これらのフラグを指定するかどうかを問わず、ホスト部分がチェックされるかどうかは関係ありません。偽

filter_var('test1/2.html', FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED); 

リターン:このような有効な相対URLをフィルタリング例えば

、。

答えて

1

あなたは正しいです。これらの2つのフラグは、デフォルトで有効になっており、公式文書(下記参照)に記載されているものの、無効にする方法はありません。あなたが質問に書いたように、彼らは役に立たない。私はそれがバグだと思う。相対値はbugreportです。

From PHP docs

有効なURLがHTTPプロトコルHTTPを指定しない場合があり注意://そうさらなる検証はURLが期待プロトコルを使用するかを決定するために必要とされ得る、例えばssh://またはmailto:。

From RFC2396:あなたが見ることができるように、それは相対的かどう

URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ] 
    absoluteURI = scheme ":" (hier_part | opaque_part) 
    relativeURI = (net_path | abs_path | rel_path) [ "?" query ] 

    hier_part  = (net_path | abs_path) [ "?" query ] 
    opaque_part = uric_no_slash *uric 

    uric_no_slash = unreserved | escaped | ";" | "?" | ":" | "@" | 
        "&" | "=" | "+" | "$" | "," 

    net_path  = "//" authority [ abs_path ] 
    abs_path  = "/" path_segments 
    rel_path  = rel_segment [ abs_path ] 

    rel_segment = 1*(unreserved | escaped | 
         ";" | "@" | "&" | "=" | "+" | "$" | ",") 

    scheme  = alpha *(alpha | digit | "+" | "-" | ".") 

    authority  = server | reg_name 

    reg_name  = 1*(unreserved | escaped | "$" | "," | 
         ";" | ":" | "@" | "&" | "=" | "+") 

    server  = [ [ userinfo "@" ] hostport ] 
    userinfo  = *(unreserved | escaped | 
        ";" | ":" | "&" | "=" | "+" | "$" | ",") 

    hostport  = host [ ":" port ] 
    host   = hostname | IPv4address 
    hostname  = *(domainlabel ".") toplabel [ "." ] 
    domainlabel = alphanum | alphanum *(alphanum | "-") alphanum 
    toplabel  = alpha | alpha *(alphanum | "-") alphanum 
    IPv4address = 1*digit "." 1*digit "." 1*digit "." 1*digit 
    port   = *digit 

    path   = [ abs_path | opaque_part ] 
    path_segments = segment *("/" segment) 
    segment  = *pchar *(";" param) 
    param   = *pchar 
    pchar   = unreserved | escaped | 
        ":" | "@" | "&" | "=" | "+" | "$" | "," 

    query   = *uric 

    fragment  = *uric 

    uric   = reserved | unreserved | escaped 
    reserved  = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | 
        "$" | "," 
    unreserved = alphanum | mark 
    mark   = "-" | "_" | "." | "!" | "~" | "*" | "'" | 
        "(" | ")" 

    escaped  = "%" hex hex 
    hex   = digit | "A" | "B" | "C" | "D" | "E" | "F" | 
          "a" | "b" | "c" | "d" | "e" | "f" 

    alphanum  = alpha | digit 
    alpha   = lowalpha | upalpha 

    lowalpha = "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | 
      "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | 
      "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z" 
    upalpha = "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | 
      "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | 
      "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z" 
    digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | 
      "8" | "9" 

、有効なURLは、スキームの一部またはホスト名の一部を持っていないかもしれません。おそらく、FILTER_FLAG_SCHEME_REQUIREDFILTER_FLAG_HOST_REQUIREDは、設計上の存在を確認するのに役立ちます。しかしそれは決して可能ではありません。

+0

? 'filter_var( 'test1/2.html'、FILTER_VALIDATE_URL);' falseを返しますが、その有効な相対URLはわかっています... –

+1

あなたは正しいです。これらの2つのフラグはデフォルトでオンになっており、無効にする方法はありません。あなたが質問に書いたように、彼らは役に立たない。私はそれがバグだと思う。相対的なバグレポートがあります:https://bugs.php.net/bug.php?id=72301 –

+0

うわー、私はそのバグだと思います。あなたの答えを更新すれば、私はそれを受け入れる準備が整います。 –

0

フラグFILTER_FLAG_SCHEME_REQUIREDFILTER_FLAG_HOST_REQUIREDは、5.2.1以降は常にオンになっているため、無効にする方法はなく、PHPソースのどこにも実際には使用されていません。

https://bugs.php.net/bug.php?id=75442

ドキュメントはただの定数の使用に関して明らかにされているが、彼らは次の主要なPHPのリリースまで削除される可能性が高いじゃない:後方互換性を維持するために[例えばPHP8] 。

があり、ホスト名の部分を必要としないハードコーディングされたスキームの狭いセット、[mailto:news:、およびfile:]ですが、あなたはホストやスキーム部品あなたを持っていない他のURLの検証を実装する場合parse_url()を呼び出し、その復帰時に動作するものを書く必要があります。

あなたはここに現在のURLの検証ソースでのぞき見を持つことができます:あなたは、私は、FILTER_VALIDATE_URL` `相対URLのためにしてください確認することができる方法の例を提供することができますhttps://github.com/php/php-src/blob/master/ext/filter/logical_filters.c#L517-L574

関連する問題