gpt4 book ai didi

PHP filter_var URL

转载 作者:行者123 更新时间:2023-12-04 01:57:50 25 4
gpt4 key购买 nike

为了验证来自用户输入的 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 来反射(reflect)这种行为。

如果您想要更严格的测试,您需要自己编写所需的代码。例如,您可以防止“://”出现多次:

$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;
}

您也可以尝试调整正则表达式本身。

关于PHP filter_var URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34411764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com