URL-hulpmiddelen
URL-codering voor spaties: %20 of Plus?
Een URL-ruimte wordt %20 in een URI-component en + alleen in serialisatie in formulierstijl.
Door Vigneshwaran Vijayakumar, Ontwikkelaar en Uitgever | | Beoordeeld onder de ClockTools redactioneel beleid
Inhoudsopgave
Een spatie in URL-gegevens wordt meestal %20, maar serialisatie van query's in formulierstijl vertegenwoordigt het als +. Beide kunnen juist zijn. De juiste uitvoer hangt af van de bestemming: gebruik procentuele codering voor een individuele URI-component en gebruik de plusconventie alleen wanneer de ontvangende workflow dit verwacht application/x-www-form-urlencoded gegevens.
De ClockTools URL-encoder maakt die context expliciet met URI-component-, volledige URL- en formuliergegevensprofielen. Plakken groene thee, schakel tussen profielen en vergelijk de uitvoer voordat u de applicatiecode wijzigt.
Begin met de bestemming
Vraag niet: “Welk symbool betekent altijd spatie?” Vraag welke parser de waarde zal ontvangen.
Voor een padsegment, fragmentwaarde of individuele querywaarde is procentuele codering de betrouwbare representatie. De UTF-8 byte van het spatieteken is hexadecimaal 20, dus het procentgecodeerde triplet is %20.
Voor HTML gegevens in formulierstijl wordt gebruik gemaakt van de serialisatieconventie + voor spaties en procenten codeert voor een letterlijke plus as %2B. De WHATWG URL Standaard definieert dit formulier-urlengecodeerde gedrag afzonderlijk van de algemene URL-parsering.
De RFC 3986 URI-syntaxis definieert een procent-gecodeerd octet als % gevolgd door twee hexadecimale cijfers. Het maakt ook onderscheid tussen gereserveerde scheidingstekens en niet-gereserveerde gegevenstekens. Dat onderscheid is de reden dat het coderen van een waarde anders is dan het coderen van een volledig adres.
De %20 versus plus beslissingstabel
| Bestemming | Ruimte representatie | Voorbeeld voor groene thee | Waarom |
|---|---|---|---|
| Padsegment | %20 | /topics/groen%20thee | Ruimte zijn gegevens binnen één padsegment |
| Querywaarde gecodeerd als een component | %20 | ?q=groen%20thee | Componentcodering houdt de waarde gescheiden van scheidingstekens |
| Formulier-urlengecodeerde query- of verzoektekst | + | q=groen+thee | De formulierserializer wijst ruimte toe aan plus |
| Volledige URL-weergave | %20 waar een letterlijke spatie geserialiseerd moet worden | https://example.com/green%20tea?q=hot%20cup | Structureel :, /, ?, =, en & blijven scheidingslijnen |
| Letterlijk plus inside-form-gegevens | %2B | q=C%2B%2B | Een kale plus zou decoderen als een spatie in dat profiel |
De laatste rij voorkomt een veel voorkomende bug. Als de beoogde waarde dat is C++, verzenden C++ via een formulierdecoder kan produceren C . Codeer elke letterlijke plus als %2B vóór het parseren van formulieren.
Vier reproduceerbare ClockTools tests
We hebben vier kleine inputs uitgevoerd tijdens de huidige toolimplementatie. Het URI-componentprofiel gebruikt JavaScript encodeURIComponent. Form Data past dezelfde componentcodering toe en vervangt deze vervolgens %20 met +. Volledig URL-gebruik codeURI, waardoor de URL-structuur behouden blijft.
| Invoer | Profiel | Waargenomen output | Interpretatie |
|---|---|---|---|
groene thee | URI-component | groen%20thee | Eén component, procent-gecodeerde ruimte |
groene thee | Formuliergegevens | groen+thee | Ruimteconventie in vormstijl |
C++ | Formuliergegevens | C%2B%2B | Letterlijke plustekens zijn beschermd |
https://example.com/a b?q=x y | Volledige URL | https://example.com/a%20b?q=x%20y | URL-scheidingstekens blijven structureel |
Dit zijn deterministische transformatieresultaten, geen bewijsmateriaal voor zoekrangschikking. U kunt ze lokaal in de browser reproduceren. De pagina werkt de uitvoer onmiddellijk bij, rapporteert het percentage ontsnappingen en het aantal bytes en hoeft de invoer niet naar een server te sturen voor de conversie.
Gebruik de URL-decoder om de omgekeerde controle uit te voeren. Decoderen groen%20thee onder het componentenprofiel en groen+thee onder Formuliergegevens. De decoder waarschuwt wanneer er een plusje verschijnt onder een niet-formulierprofiel omdat de bedoelde betekenis dubbelzinnig is.
Wat beschermt componentcodering?
Een URL gebruikt interpunctie als grammatica. In een queryreeks wordt & kan een andere parameter beginnen en = scheidt een naam van een waarde. # begint een fragment. ? begint een vraag. Als een van die karakters thuishoort in de gebruikersgegevens, kan het onbewerkt laten de structuur veranderen.
Overweeg de waarde timer en wekker. Componentcodering produceert timer%20%26%20alarm. Het ampersand wordt %26, dus een parser ontvangt één waarde in plaats van te interpreteren alarm als nieuwe parameter.
Codering is representatie, geen validatie of encryptie. Een procent-gecodeerde omleiding kan na decodering nog steeds naar een niet-goedgekeurde host verwijzen. Een gecodeerd script is nog steeds niet-vertrouwde invoer. Valideer toegestane schema's, hosts, parameternamen en bedrijfsregels na het parseren. Vermijd het plaatsen van wachtwoorden, tokens of andere geheimen in URL's, omdat adressen kunnen verschijnen in de geschiedenis, logboeken, analyses, schermafbeeldingen en verwijzende gegevens.
Wanneer u een queryreeks voor en na moet vergelijken, wordt de Tekstverschilcontrole maakt elke gewijzigde ontsnapping zichtbaar. Dat is betrouwbaarder dan het scannen van een lange callback-URL om te zien of er één ontbreekt %25.
Waarom creëert dubbele codering %2520?
Dubbele codering vindt plaats wanneer reeds gecodeerde tekst als onbewerkte gegevens wordt behandeld en opnieuw wordt gecodeerd.
Begin met één spatie:
```tekst
spatie -> %20
```
Coderen %20 als nieuw onderdeel. Het procentteken wordt %25, terwijl de cijfers letterlijk blijven:
```tekst
%20 -> %2520
```
Eén decodering verandert %2520 terug naar %20. Een tweede decodering verandert %20 naar een ruimte. Als uw toepassing één decoderingspas verwacht, maar een dubbel gecodeerde waarde ontvangt, kan de gebruiker dit zien %20 in plaats van een blanco.
De oplossing is om niet herhaaldelijk te decoderen totdat de tekst er goed uitziet. Herhaaldelijke decodering kan opzettelijk gecodeerde scheidingstekens wijzigen en beveiligingsproblemen veroorzaken. Identificeer de eigendomsgrens: precies één laag moet de component coderen, en precies één overeenkomstige laag moet deze decoderen.
Een foutopsporingspad voor spaties
Gebruik dit pad wanneer één systeem verzendt %20 en een ander wordt weergegeven +, %2520, of een letterlijke blanco.
1. Leg de onbewerkte waarde vast voordat een raamwerkparser deze wijzigt.
2. Bepaal of het veld een padsegment, querycomponent, volledige URL of formulierhoofdtekst is.
3. Noteer de verwachte gedecodeerde waarde, inclusief letterlijke plustekens.
4. Reproduceer dezelfde invoer in het overeenkomende ClockTools profiel.
5. Eén keer decoderen met het ontvangende profiel.
6. Vergelijk het resultaat met de verwachte waarde.
7. Zoek in de applicatiestroom naar een tweede encoder of decoder als %25 verschijnt onverwacht.
| Symptoom | Eerste controle | Waarschijnlijke oorzaak |
|---|---|---|
groen+thee blijft met een plusje | Decoderprofiel | Componentdecoder wijst plus niet toe aan de ruimte |
C++ wordt C | Codering van de afzender | Letterlijke plustekens werden niet gecodeerd als %2B |
%20 is zichtbaar voor de gebruiker | Decodeer telling | Gecodeerde gegevens zijn nooit gedecodeerd of eerder dubbel gecodeerd |
%2520 verschijnt in een verzoek | Aantal coderen | Procentteken van %20 werd opnieuw gecodeerd |
| Query wordt gesplitst na een ampersand | Componentgrens | Een gegevens-ampersand werd onbewerkt gelaten |
Dit foutopsporingspad is opzettelijk smal. Het scheidt de datacontext van giswerk en elke stap heeft een zichtbare input en output.
Wanneer moet u een volledige URL coderen?
Gebruik het volledige URL-profiel alleen als u wilt dat het adres een adres blijft. Het behoudt structurele interpunctie, zoals de dubbele punt, schuine strepen, vraagteken, gelijkteken, ampersand en fragmentmarkering, terwijl tekens zoals spaties worden gecodeerd.
Gebruik de URI-component wanneer een volledige URL zelf in een andere parameter is genest. Er wordt bijvoorbeeld een terugbeladres geplaatst in omleiden= zijn gegevens vanuit het perspectief van de buitenste URL. Het coderen van het geneste adres als één component voorkomt dit ? en & van deelname aan de buitenste query.
Geef een adres niet herhaaldelijk door verschillende profielen in de hoop op een universeel veilige reeks. Schrijf de grens expliciet:
```tekst
buitenste URL-structuur + encodeURIComponent (binnenste callback-URL)
```
De ontvangende toepassing moet de buitenste URL parseren, de callback-component extraheren, deze één keer decoderen, de resulterende binnen-URL parseren en de bestemming valideren. Codering houdt de syntaxis intact; validatie beslist of de bestemming is toegestaan.
Veelgestelde vragen
Moet een URL-spatie %20 of een plusteken zijn?
Gebruik %20 voor een spatie binnen een algemene URI-component. Gebruik + wanneer de ontvangende workflow expliciet application/x-www-form-urlencoded serialisatie verwacht.
Waarom decodeert een plusteken als een spatie?
Parsers in formulierstijl wijzen + toe aan een spatie als onderdeel van de formulier-urlencoded-conventie. Een algemene componentendecoder hoeft die vervanging niet toe te passen.
Hoe codeer ik een letterlijk plusteken in formuliergegevens?
Codeer de plus als %2B. Anders kan een formulierdecoder de kale plus als een spatie interpreteren.
Wat betekent %2520?
%2520 duidt meestal op dubbele codering. Het procentteken in een bestaande %20 escape werd %25, dus één decodering retourneert %20 en een tweede decodering retourneert een spatie.
Moet ik een volledige URL coderen met encodeURIComponent?
Niet wanneer het schema, de schuine strepen, de scheidingstekens voor zoekopdrachten en de fragmentmarkering structureel moeten blijven. Gebruik componentcodering wanneer de hele URL is genest als gegevens binnen een andere waarde.
Maakt URL-codering niet-vertrouwde invoer veilig?
Nee. Bij het coderen blijven de syntaxisgrenzen behouden, maar de ontvanger moet na het parseren nog steeds schema's, hosts, omleidingen, parameterwaarden, machtigingen en andere bedrijfsregels valideren.

