Blog ClockTools

Outils d'URL

Encodage des espaces dans les URL : %20 ou signe plus ?

Un espace devient %20 dans un composant URI, et + uniquement dans une sérialisation de formulaire.

Par , développeur et éditeur | | Révisé conformément à la politique éditoriale de ClockTools

Illustration ClockTools sur l'encodage des espaces dans les URL
Table des matières

Dans les données d'une URL, un espace devient généralement %20, mais la sérialisation de requêtes de type formulaire le représente par +. Les deux peuvent être corrects. Le bon résultat dépend de la destination : utilisez l'encodage en pourcentage pour un composant URI individuel, et la convention du signe plus uniquement si le système récepteur attend des données application/x-www-form-urlencoded.

L'encodeur d'URL ClockTools explicite ce contexte avec les profils URI Component, Full URL et Form Data. Collez green tea, changez de profil et comparez les résultats avant de modifier le code de l'application.

Commencez par la destination

Ne demandez pas « Quel symbole désigne toujours un espace ? », mais « Quel analyseur recevra la valeur ? ».

Pour un segment de chemin, une valeur de fragment ou une valeur de requête individuelle, l'encodage en pourcentage est une représentation fiable. L'octet UTF-8 de l'espace vaut 20 en hexadécimal : son triplet encodé en pourcentage est donc %20.

Pour les données de formulaires HTML, la convention de sérialisation utilise + pour les espaces et encode un signe plus littéral en %2B. Le standard URL du WHATWG définit ce comportement form-urlencoded séparément de l'analyse générale des URL.

Le texte de la RFC 3986 sur la syntaxe des URI définit un octet encodé en pourcentage par % suivi de deux chiffres hexadécimaux. Il distingue aussi les délimiteurs réservés des caractères de données non réservés. C'est pourquoi encoder une valeur diffère d'encoder une adresse entière.

Arbre de décision : espace encodé en %20 dans un composant URI ou en signe plus dans une sérialisation de formulaire
Arbre de décision : espace encodé en %20 dans un composant URI ou en signe plus dans une sérialisation de formulaire

Tableau de choix entre %20 et le signe plus

DestinationReprésentation de l'espaceExemple pour green teaPourquoi
Segment de chemin%20/topics/green%20teaL'espace est une donnée à l'intérieur d'un segment de chemin
Valeur de requête codée en tant que composant%20?q=green%20teaL'encodage des composants maintient la valeur séparée des délimiteurs
Chaîne de requête ou corps de requête au format form-urlencoded+q=green+teaLe sérialiseur de formulaire convertit l'espace en signe plus
Affichage d'une URL complète%20 lorsqu'un espace littéral doit être sérialiséhttps://example.com/green%20tea?q=hot%20cupLes signes structurels :, /, ?, = et & restent des délimiteurs
Signe plus littéral dans les données de formulaire%2Bq=C%2B%2BUn signe plus non encodé serait décodé comme un espace dans ce profil

La dernière ligne évite un problème fréquent. Si la valeur souhaitée est C++, envoyer C++ à un décodeur de formulaire peut produire C . Encodez chaque signe plus littéral en %2B avant l'analyse du formulaire.

Quatre tests ClockTools reproductibles

Nous avons testé quatre petites entrées dans l'implémentation actuelle de l'outil. Le profil URI Component utilise JavaScript encodeURIComponent. Form Data applique le même encodage du composant, puis remplace %20 par +. Full URL utilise encodeURI, qui préserve la structure de l'URL.

EntréeProfilRésultat observéInterprétation
green teaComposant URIgreen%20teaComposant unique, espace encodé en pourcentage
green teaDonnées du formulairegreen+teaConvention des espaces dans les formulaires
C++Données du formulaireC%2B%2BLes signes plus littéraux sont protégés
https://example.com/a b?q=x yURL complètehttps://example.com/a%20b?q=x%20yLes délimiteurs d'URL restent structurels

Ce sont des résultats de transformations déterministes, pas des preuves de classement dans les moteurs de recherche. Vous pouvez les reproduire localement dans le navigateur. La page actualise immédiatement le résultat, indique les séquences d'échappement en pourcentage et le nombre d'octets, sans avoir à envoyer la saisie à un serveur.

Utilisez le décodeur d'URL pour effectuer le contrôle inverse. Décodez green%20tea avec le profil composant et green+tea avec Form Data. Le décodeur avertit lorsqu'un signe plus apparaît dans un profil hors formulaire, car son sens est alors ambigu.

Que protège l'encodage d'un composant ?

Dans une URL, la ponctuation joue un rôle grammatical. Dans une chaîne de requête, & peut introduire un autre paramètre et = sépare le nom de sa valeur. # commence un fragment. ? commence une requête. Si l'un de ces signes appartient aux données saisies, le laisser brut peut modifier la structure.

Prenez la valeur timer & alarm. L'encodage du composant produit timer%20%26%20alarm. L'esperluette devient %26 : l'analyseur reçoit donc une seule valeur au lieu d'interpréter alarm comme un nouveau paramètre.

L'encodage est une représentation, pas une validation ni un chiffrement. Une redirection encodée en pourcentage peut toujours pointer vers un hôte non autorisé après décodage. Un script encodé reste une entrée non fiable. Après analyse, validez les schémas, les hôtes, les noms de paramètres et les règles métier autorisés. Évitez d'inscrire des mots de passe, des jetons ou d'autres secrets dans les URL : les adresses peuvent apparaître dans l'historique, les journaux, les données d'analyse, les captures d'écran et les données de provenance.

Pour comparer une chaîne de requête avant et après, le vérificateur de différences de texte rend visible chaque séquence d'échappement modifiée. C'est plus fiable que de rechercher à l'œil un %25 manquant dans une longue URL de rappel.

Pourquoi le double encodage crée-t-il %2520 ?

Le double encodage se produit lorsqu'un texte déjà encodé est traité comme des données brutes et à nouveau encodé.

Commencez par un espace :

space -> %20

Encodez %20 comme un nouveau composant. Le signe de pourcentage devient %25, tandis que les chiffres restent littéraux :

%20 -> %2520

Un premier décodage transforme %2520 en %20. Le second transforme %20 en espace. Si l'application attend un seul décodage mais reçoit une valeur doublement encodée, l'utilisateur peut voir %20 au lieu d'un espace.

La solution n'est pas de décoder à répétition jusqu'à ce que le texte semble correct. Cela peut modifier des délimiteurs délibérément encodés et créer des problèmes de sécurité. Définissez clairement les responsabilités : une seule couche doit encoder le composant, et une seule couche correspondante doit le décoder.

Méthode de diagnostic des espaces mal interprétés

Suivez cette méthode lorsqu'un système envoie %20 et qu'un autre affiche +, %2520 ou un espace brut.

  1. Capturez la valeur brute avant qu'un analyseur de framework ne la modifie.
  2. Identifiez si le champ est un segment de chemin, un composant de requête, une URL complète ou un corps de formulaire.
  3. Enregistrez la valeur décodée attendue, y compris les signes plus littéraux.
  4. Reproduisez la même entrée dans le profil ClockTools correspondant.
  5. Décodez une fois avec le profil de réception.
  6. Comparez le résultat avec la valeur attendue.
  7. Recherchez un deuxième encodeur ou décodeur dans le flux de l'application si %25 apparaît de manière inattendue.
SymptômePremier contrôleCause probable
green+tea reste avec un plusProfil du décodeurLe décodeur de composants ne convertit pas le signe plus en espace
C++ devient C Encodage de l'expéditeurLes signes plus littéraux n'ont pas été encodés en %2B
%20 est visible par l'utilisateurNombre de décodagesLes données codées n'ont jamais été décodées ou ont été codées deux fois auparavant
%2520 apparaît dans une requêteNombre d'encodagesLe signe de pourcentage de %20 a été encodé à nouveau
La requête se divise après une esperluetteLimite du composantUne esperluette appartenant aux données est restée brute

Ce chemin de débogage est intentionnellement étroit. Il sépare le contexte des données des conjectures, et chaque étape a une entrée et une sortie visibles.

Quand faut-il encoder une URL complète ?

Utilisez le profil Full URL uniquement si l'adresse doit rester une adresse. Il conserve la ponctuation structurelle, notamment les deux-points du schéma, les barres obliques, le point d'interrogation, le signe égal, l'esperluette et le marqueur de fragment, tout en encodant les caractères comme les espaces.

Utilisez URI Component lorsqu'une URL complète est imbriquée dans un autre paramètre. Par exemple, une adresse de rappel placée dans redirect= constitue une donnée pour l'URL extérieure. L'encoder comme un seul composant empêche ses ? et & de rejoindre la requête extérieure.

Ne transmettez pas une adresse à plusieurs reprises via différents profils en espérant obtenir une chaîne universellement sûre. Écrivez explicitement la limite :

outer URL structure + encodeURIComponent(inner callback URL)

L'application réceptrice doit analyser l'URL externe, extraire le composant de rappel, le décoder une fois, analyser l'URL interne résultante et valider la destination. Le codage conserve la syntaxe intacte ; la validation décide si la destination est autorisée.

Foire aux questions

Un espace d'URL doit-il être %20 ou un signe plus ?

Utilisez %20 pour un espace à l'intérieur d'un composant URI général. Utilisez + lorsque le workflow de réception attend explicitement la sérialisation application/x-www-form-urlencoded.

Pourquoi un signe plus est-il décodé comme un espace ?

Les analyseurs de formulaires convertissent + en espace selon la convention form-urlencoded. Un décodeur de composants général n'est pas tenu d'effectuer cette substitution.

Comment encoder un signe plus littéral dans les données d'un formulaire ?

Encodez le plus comme %2B. Sinon, un décodeur de formulaire peut interpréter le simple plus comme un espace.

Que signifie %2520 ?

%2520 indique généralement un double encodage. Le signe de pourcentage dans un échappement %20 existant est devenu %25, donc un décodage renvoie %20 et un deuxième décodage renvoie un espace.

Dois-je encoder une URL entière avec encodeURIComponent ?

Pas quand son schéma, ses barres obliques, ses délimiteurs de requête et son marqueur de fragment doivent rester structurels. Utilisez l'encodage des composants lorsque l'URL entière est imbriquée sous forme de données dans une autre valeur.

Le codage d’URL sécurise-t-il les entrées non fiables ?

Non. L'encodage préserve les limites de syntaxe, mais le récepteur doit toujours valider les schémas, les hôtes, les redirections, les valeurs de paramètres, les autorisations et autres règles métier après l'analyse.

À propos de l'auteur

Vigneshwaran Vijayakumar

Fondateur, développeur et éditeur de ClockTools | Responsable du marketing numérique | Inde

Vigneshwaran est un ingénieur qui possède plusieurs décennies d'expérience technique et a notamment exercé comme responsable du marketing numérique à Dubaï. Son travail associe analyse de données, référencement naturel, optimisation du taux de conversion, systèmes de contenu, production visuelle, intelligence artificielle appliquée et apprentissage automatique. Chez ClockTools, il met cette expérience multidisciplinaire au service d'outils en ligne ciblés et de guides pratiques attentifs à la qualité des sources.

Profil LinkedIn