簡體   English   中英

PHP filter_var URL

[英]PHP filter_var URL

為了從用戶輸入驗證URL路徑,我使用了PHP filter_var函數。 輸入僅包含路徑(/path/path/script.php)。

驗證路徑時,我添加了主機。 我在玩一些,測試輸入驗證等。這樣做,我注意到過濾器URL函數的奇怪行為(??)。

碼:

$url = "http://www.domain.nl/http://www.google.nl/modules/authorize/test/normal.php";
var_dump(filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_HOST_REQUIRED)); //valid

有人可以解釋為什么這是一個有效的URL嗎? 謝謝!

簡短的答案是,PHP FILTER_VALIDATE_URL僅根據RFC 2396檢查URL,並且您的URL盡管很奇怪,但根據上述標准仍然有效。

長答案:

您使用的過濾器已聲明符合RFC,因此讓我們檢查一下該標准( RFC 2396 )。

用於解析URL並在其中列出的正則表達式為:

^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
 12            3  4          5       6  7        8 9

哪里:

scheme    = $2
authority = $4
path      = $5
query     = $7
fragment  = $9

正如我們所看到的,“:”字符僅在方案的上下文中保留,從那時起,“:”是公平的游戲(標准文本對此提供了支持)。 例如,在http:方案中可以自由使用它來表示端口。 斜杠也可以出現在任何位置,沒有任何阻止URL中間出現“ //”的地方。 因此,中間的“ http://”應該是有效的。

讓我們看一下您的URL並嘗試將其與此正則表達式匹配:

$url = "http://www.domain.nl/http://www.google.nl/modules/authorize/test/normal.php";
//Escaped a couple slashes to make things work, still the same regexp
$result_rfc = preg_match('/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/',$url);
echo '<p>'.$result_rfc.'</p>';

測試返回“ 1”,因此此URL有效。 這是意料之中的,因為規則並未聲明中間帶有類似“ http://”之類的網址是無效的,正如我們所看到的那樣。 PHP僅使用FILTER_VALIDATE_URL來反映此行為。

如果您想進行更嚴格的測試,則需要自己編寫所需的代碼。 例如,您可以防止“://”出現多次:

$url = "http://www.domain.nl/http://www.google.nl/modules/authorize/test/normal.php";
$result_rfc = preg_match('/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/',$url);
if (substr_count($url,'://') != 1) {
    $result_non_rfc = false;
} else {
    $result_non_rfc = $result_rfc;
}

您也可以嘗試調整正則表達式本身。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM