Une URL (localisateur uniforme de ressource) est une adresse d'au plus sept parties. Ce qui suit le ? est la chaîne de requête, une liste de paires clé=valeur qui transmet de petites quantités de données au serveur. Comme quelques caractères ont un sens spécial dans une URL, toute donnée qui en contient doit être encodée en pourcentage.
Anatomie d'une URL
Prenons cette adresse :
https://[email protected]:8443/shop/shoes?q=red+shoes&size=9&tag=a&tag=b#reviews
| Partie | Valeur | Remarques |
|---|---|---|
| Schéma | https |
Quel protocole utiliser |
| Informations utilisateur | user |
Rares, mieux vaut les éviter |
| Hôte | www.example.com |
Quel serveur ; insensible à la casse |
| Port | 8443 |
Par défaut : 80 pour HTTP, 443 pour HTTPS |
| Chemin | /shop/shoes |
Quelle ressource sur le serveur |
| Requête | q=red+shoes&size=9&tag=a&tag=b |
Paramètres, après ? |
| Fragment | reviews |
Un endroit dans la page ; jamais envoyé au serveur |
Collez n'importe quelle adresse dans l'analyseur d'URL pour voir ces parties et chaque paramètre de requête séparément.
Encodage en pourcentage
Les caractères réservés ont des rôles dans une URL : ? ouvre la requête, & sépare les paires, = sépare la clé de la valeur, # ouvre le fragment, / sépare les segments de chemin. Pour en utiliser un comme simple donnée, écrivez % suivi de sa valeur d'octet en hexadécimal. Les caractères hors ASCII sont d'abord convertis en octets UTF-8, puis chaque octet est encodé.
| Caractère | Encodé |
|---|---|
| espace | %20 (ou + dans les requêtes de formulaire) |
# |
%23 |
& |
%26 |
= |
%3D |
? |
%3F |
/ |
%2F |
% |
%25 |
é |
%C3%A9 |
€ |
%E2%82%AC |
Encodez et décodez du texte avec l'encodeur d'URL et le décodeur d'URL. Notez que % lui-même doit être encodé en %25, d'où le fait que décoder deux fois abîme les valeurs.
Chaînes de requête
Les paires sont séparées par &. La même clé peut se répéter et les récepteurs décident comment la lire. L'analyse de la requête ci-dessus donne :
| Clé | Valeurs |
|---|---|
q |
red shoes |
size |
9 |
tag |
a, b (la clé apparaît deux fois) |
Pour construire une requête correctement encodée, saisissez les paires dans le générateur de chaîne de requête. Par exemple, les valeurs red shoes & boots et 10-20 deviennent q=red+shoes+%26+boots&price=10-20. Les balises de campagne sont une application de la même idée : voir Comment créer des liens UTM pour suivre vos campagnes.
Noms de domaine internationaux
Les noms d'hôte voyagent en ASCII. Un nom comportant des lettres accentuées ou non latines est converti en punycode et préfixé de xn-- : münchen.de devient xn--mnchen-3ya.de. Les lettres d'allure identique d'autres alphabets font du même mécanisme un favori des hameçonneurs : convertissez donc les hôtes suspects avec le convertisseur de nom d'hôte en Punycode.
Pièges courants
- Oublier d'encoder une valeur. Un
&ou#non échappé dans une valeur la tronque silencieusement. - Double encodage. Encoder une chaîne déjà encodée transforme
%20en%2520. - Mettre des secrets dans l'URL. Les chaînes de requête finissent dans les journaux, l'historique et les en-têtes de référent.
- Supposer une valeur par clé. Lisez les clés répétées comme des listes.
- Se fier à la partie visible d'un lien. Voir Comment analyser un lien suspect en toute sécurité.