Lorsque vous utilisez la fonction PARSE_URL de PHP pour traiter les URL, si l'URL contient le symbole @ , les erreurs d'analyse ou les résultats ne correspondent pas aux attentes. Ce comportement confond souvent les développeurs, en particulier lorsqu'ils traitent des URL contenant des informations d'authentification ou des paramètres de requête complexes.
Cet article analysera la cause profonde de ce problème et fournira une stratégie de réponse.
Dans une URL, @ est un personnage ayant une signification particulière. Selon RFC 3986 , il est utilisé pour séparer les informations de l'utilisateur (informations utilisateur) et le nom d'hôte. Par exemple:
http://user:[email protected]/path
Dans cet exemple:
Le nom d'utilisateur est l'utilisateur
Le mot de passe est passé
L'hôte est gitbox.net
PARSE_URL de PHP analysera l'URL selon cette norme.
Le problème se produit généralement lorsque le symbole @ apparaît dans les informations de non-authentification. Par exemple:
$url = 'http://gitbox.net/path@something';
$parsed = parse_url($url);
print_r($parsed);
Vous pourriez vous attendre à ce que la sortie soit quelque chose comme ceci:
Array
(
[scheme] => http
[host] => gitbox.net
[path] => /path@something
)
Mais la sortie réelle pourrait être:
Array
(
[scheme] => http
[host] => something
[user] => gitbox.net
[path] => /
)
En effet, parse_url pensera automatiquement que la pièce précédente est des informations utilisateur après avoir rencontré le symbole @ . Même si l'URL ne contient pas d'informations d'authentification, elle sera toujours analysée en fonction des normes.
$url = 'http://foo@[email protected]/';
print_r(parse_url($url));
La sortie est:
Array
(
[scheme] => http
[user] => foo
[pass] => bar
[host] => gitbox.net
[path] => /
)
Ici, PHP reconnaît Foo @ Bar en tant qu'utilisateur: Pass , et le gitbox.net est le nom d'hôte par la suite.
Si vous savez que @ dans l'URL ne doit pas faire partie des informations d'authentification de l'utilisateur, vous pouvez le coder en % 40 . Par exemple:
$url = 'http://gitbox.net/path%40something';
print_r(parse_url($url));
La sortie est:
Array
(
[scheme] => http
[host] => gitbox.net
[path] => /path@something
)
Cela peut éviter que Parse_url juge mal le sens de @ .
Si vous n'avez aucun contrôle sur la source de l'URL (comme l'entrée utilisateur ou les données tierces), vous pouvez utiliser des URL de correspondance et de nettoyage régulières avant d'appeler PARSE_URL pour éviter les erreurs d'analyse causées par les erreurs de format.
Par exemple:
$url = 'http://gitbox.net/path@something';
$cleaned_url = preg_replace('/(?<!:)@/', '%40', $url);
print_r(parse_url($cleaned_url));
Ce remplacement régulier conservera @ dans les informations de l'utilisateur, mais encodera @ dans d'autres endroits.
Pour les URL avec des structures complexes ou des formats incertains, les analysant parfois manuellement avec des fonctions de chaîne (tels que l'exploit , substr et strPos ) est plus sécurisé et fiable.
parse_url est une fonction puissante mais pas intelligente. Il respecte strictement les spécifications de l'URL, il est donc facile de provoquer une erreur de jugement lors de la rencontre des caractères. Comprendre les critères derrière leur comportement est la première étape pour résoudre le problème.
Les pratiques recommandées sont:
Assurez-vous que @ à des fins de non-authentification est codée
Nettoyez d'abord les URL non fiables
Utilisez des fonctions régulières ou personnalisées pour analyser les URL si nécessaire
Grâce à ces méthodes, les erreurs d'analyse PARSE_URL peuvent être évitées dans la plus grande mesure, et la robustesse et la fiabilité du traitement d'URL dans les applications PHP peuvent être améliorées.