ClockTools-blog

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 , Ontwikkelaar en Uitgever | | Beoordeeld onder de ClockTools redactioneel beleid

URL-codering voor spaties aanbevolen illustratie voor ClockTools
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.

Beslissingsdiagram dat een spatie doorstuurt naar procent-20 voor URI-componenten of plus voor serialisatie in formulierstijl
Beslissingsdiagram dat een spatie doorstuurt naar procent-20 voor URI-componenten of plus voor serialisatie in formulierstijl

De %20 versus plus beslissingstabel

BestemmingRuimte representatieVoorbeeld voor groene theeWaarom
Padsegment%20/topics/groen%20theeRuimte zijn gegevens binnen één padsegment
Querywaarde gecodeerd als een component%20?q=groen%20theeComponentcodering houdt de waarde gescheiden van scheidingstekens
Formulier-urlengecodeerde query- of verzoektekst+q=groen+theeDe formulierserializer wijst ruimte toe aan plus
Volledige URL-weergave%20 waar een letterlijke spatie geserialiseerd moet wordenhttps://example.com/green%20tea?q=hot%20cupStructureel :, /, ?, =, en & blijven scheidingslijnen
Letterlijk plus inside-form-gegevens%2Bq=C%2B%2BEen 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.

InvoerProfielWaargenomen outputInterpretatie
groene theeURI-componentgroen%20theeEén component, procent-gecodeerde ruimte
groene theeFormuliergegevensgroen+theeRuimteconventie in vormstijl
C++FormuliergegevensC%2B%2BLetterlijke plustekens zijn beschermd
https://example.com/a b?q=x yVolledige URLhttps://example.com/a%20b?q=x%20yURL-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.

SymptoomEerste controleWaarschijnlijke oorzaak
groen+thee blijft met een plusjeDecoderprofielComponentdecoder wijst plus niet toe aan de ruimte
C++ wordt C Codering van de afzenderLetterlijke plustekens werden niet gecodeerd als %2B
%20 is zichtbaar voor de gebruikerDecodeer tellingGecodeerde gegevens zijn nooit gedecodeerd of eerder dubbel gecodeerd
%2520 verschijnt in een verzoekAantal coderenProcentteken van %20 werd opnieuw gecodeerd
Query wordt gesplitst na een ampersandComponentgrensEen 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.

Over de auteur

Vigneshwaran Vijayakumar

Oprichter, ontwikkelaar en uitgever van ClockTools | Digitale marketingmanager | Indië

Vigneshwaran is een ingenieur met tientallen jaren technische ervaring, waaronder professioneel werk als Digital Marketing Manager in Dubai. Zijn werk verbindt data-analyse, zoekmachineoptimalisatie, conversie-optimalisatie, contentsystemen, visuele productie en toegepaste AI en machine learning. Bij ClockTools zet hij die multidisciplinaire ervaring om in gerichte browserhulpprogramma's en praktische, bronbewuste handleidingen.

LinkedIn-profiel