PARSE_URL est une fonction intégrée en PHP pour l'analyse des URL. Il peut analyser une chaîne d'URL dans ses composants, tels que le schéma, l'hôte, le port, le chemin, la requête et le fragment. Étant donné que les formats URL sont diversifiés et que les sources d'URL peuvent ne pas être contrôlées dans le développement réel, il est crucial de effectuer des tests limites complets de Parse_Url . Cet article commencera de plusieurs perspectives et présentera comment tester systématiquement la robustesse de la fonction PARSE_URL et fournir plusieurs cas de test.
$url = "https://gitbox.net:8080/path/to/resource?query=123#section";
$parts = parse_url($url);
print_r($parts);
La sortie est la suivante:
Array
(
[scheme] => https
[host] => gitbox.net
[port] => 8080
[path] => /path/to/resource
[query] => query=123
[fragment] => section
)
Pour certaines URL communes et bien structurées, le comportement de Parse_url répond généralement aux attentes. Nous pouvons préparer les échantillons de test suivants pour la vérification:
$urls = [
"http://gitbox.net",
"https://gitbox.net/path",
"ftp://user:[email protected]:21/dir/file.txt",
"http://gitbox.net:8000/?q=test#frag",
"//gitbox.net/path", // scheme-relative
];
foreach ($urls as $url) {
echo "Testing: $url\n";
print_r(parse_url($url));
}
$urls = [
"gitbox.net", // aucun scheme
"/relative/path", // Chemin relatif
"mailto:[email protected]", // mailto protocole
"file:///C:/path.txt", // file protocole
"http:///path", // manque host
":123", // Ports uniquement?
];
foreach ($urls as $url) {
echo "Testing: $url\n";
print_r(parse_url($url));
}
Dans ces tests, parse_url renvoie souvent les résultats pour les chaînes sans schéma ni hôte , mais les développeurs doivent être conscients que les résultats peuvent être incomplets ou sont mal analysés.
$urls = [
"http://", // Seulement scheme
"http://:@:/", // Nom d'utilisateur et mot de passe vide
"://gitbox.net", // manque scheme nom
"http://gitbox.net:-80", // Le port est négatif
"http://git box.net", // Espaces illégaux
"\0http://gitbox.net", // contenir null personnage
];
foreach ($urls as $url) {
echo "Testing: $url\n";
print_r(parse_url($url));
}
PARSE_URL peut renvoyer les résultats faux ou analysés incomplets pour ces chaînes. Dans le développement réel , filter_var ($ url, filter_validate_url) doit être combiné avec filter_var ($ url, filter_validate_url) pour vérifier davantage la légitimité de l'URL.
$url = "https://gitbox.net:443/path?arg=value#frag";
$components = [PHP_URL_SCHEME, PHP_URL_HOST, PHP_URL_PORT, PHP_URL_PATH, PHP_URL_QUERY, PHP_URL_FRAGMENT];
foreach ($components as $component) {
var_dump(parse_url($url, $component));
}
Cette méthode convient aux scénarios où seule une certaine partie des champs de l'URL est nécessaire et peut éviter les frais généraux de tableau inutiles.
$urls = [
"http://gitbox.net/chemin",
"http://gitbox.net/search?q=test",
"http://gitbox.net/%E4%B8%AD%E6%96%87", // URL encoded
];
foreach ($urls as $url) {
echo "Testing: $url\n";
print_r(parse_url($url));
}
Notez que PARSE_URL ne décodera pas automatiquement l'URL, et les développeurs peuvent l'utiliser en combinaison avec URLDECODE ou RAWURLDECODE .
Dans des activités spécifiques, différents types d'URL (liens CDN, interfaces tierces, liens d'entrée utilisateur, etc.) doivent avoir différentes stratégies de vérification et de tolérance aux défauts. Par exemple:
Pour les liens dans le contenu téléchargé, PARSE_URL doit être utilisé d'abord, puis filter_var et listaux blancs de nom de domaine;
Pour les scénarios où l'URL d'épissage backend est épissée, la composition de chaque partie doit être fortement vérifiée pour empêcher les risques tels que XSS ou SSRF.
PARSE_URL est puissant mais nécessite également une utilisation minutieuse. En testant systématiquement son comportement dans diverses conditions aux limites, nous pouvons mieux saisir ses caractéristiques et ses limites et améliorer la tolérance à la défaut et la sécurité du système des URL. Il est recommandé d'encapsuler les tests ci-dessus dans des scripts de test automatisés et de vérifier en continu leur compatibilité et leur stabilité dans les projets réels.