Naar de inhoud
HexSlate

URL Encoder / Decoder

Tekst om te coderen0 B

Nog niets om te converteren

Typ of plak in het vak links. Het resultaat verschijnt hier terwijl je typt.

0 code-eenheden in0 code-eenheden uit0 escapes in invoer

Wat elke modus met elk teken doet

Component is bijna altijd het antwoord. Hele URL laat &, =, ?, / en # met rust, want in een samengesteld adres zijn dat structuur en geen data. Strikt RFC 3986 escapet daarbovenop !, ', (, ) en *, die geen van beide ingebouwde JavaScript-functies aanraakt omdat RFC 2396 ze "marks" noemde en RFC 3986 §2.2 er later gereserveerde sub-delimiters van maakte. OAuth 1.0 en AWS Signature Version 4 ondertekenen de strikte vorm. Een kaal teken hieronder betekent dat die modus het met rust laat.

Teken Component Hele URL Formulier RFC 3986
spatie %20%20+%20
! !!%21%21
" %22%22%22%22
# %23#%23%23
$ %24$%24%24
% %25%25%25%25
& %26&%26%26
' ''%27%27
( ((%28%28
) ))%29%29
* ***%2A
+ %2B+%2B%2B
, %2C,%2C%2C
/ %2F/%2F%2F
: %3A:%3A%3A
; %3B;%3B%3B
< %3C%3C%3C%3C
= %3D=%3D%3D
> %3E%3E%3E%3E
? %3F?%3F%3F
@ %40@%40%40
[ %5B%5B%5B%5B
\ %5C%5C%5C%5C
] %5D%5D%5D%5D
^ %5E%5E%5E%5E
` %60%60%60%60
{ %7B%7B%7B%7B
| %7C%7C%7C%7C
} %7D%7D%7D%7D
~ ~~%7E~

Waarom %2520 verschijnt, en wat je eraan doet

%2520 is een spatie die twee keer gecodeerd is. De eerste ronde geeft %20; de tweede ziet een letterlijk procentteken, zelf ook gereserveerd, en codeert dat als %25. Hetzelfde gebeurt met elke escape: %26 wordt %2526.

Het komt van een waarde die in de applicatie gecodeerd is en daarna nog eens door een framework, een proxy of een redirect die de URL opnieuw opbouwt. Decoderen herhaalt hier tot er niets meer verandert en laat elke laag zien. Twee lagen is normaal; drie betekent dat iets in de keten een al gecodeerde waarde codeert, en daar hoort de oplossing thuis.

Wat de URL-parser herschrijft

Uitsplitsen gebruikt de URL-parser van de browser, en die herschrijft net zo goed als hij splitst. Een standaardpoort verdwijnt, dus https://example.com:443/ en https://example.com/ zijn als string niet gelijk. Een hostnaam met niet-ASCII wordt Punycode: münchen.de gaat als xn--mnchen-3ya.de de lijn op, want de host is het enige deel van een URL dat niet percent-gecodeerd wordt (RFC 3492).

Veelvoorkomende problemen

  • Een waarde valt uiteen in twee parameters. Een & zonder escape beëindigt de waarde. Codeer de waarde voordat je hem aan elkaar plakt, niet de afgemaakte URL achteraf.
  • Decoderen liet de ampersands staan.decodeURI weigert %26, %3D, %2F en de rest van de gereserveerde set, want dat zou de structuur van de URL veranderen. Gebruik Component.
  • Tekst gecodeerd vanuit Latin-1.caf%E9 komt van een systeem waar é één byte is; UTF-8 schrijft het als %C3%A9. Codeer opnieuw bij de bron.
  • Een spatie als + in een pad. Die vervanging hoort bij formulierbodies en query strings. In een padsegment is een plus een plus, dus my file.pdf moet my%20file.pdf zijn.

Veelgestelde vragen

Wat is het verschil tussen encodeURI en encodeURIComponent?

De veilige set. encodeURIComponent escapet alles behalve letters, cijfers en - _ . ! ~ * ' ( ). encodeURI laat daarbovenop de scheidingstekens ; , / ? : @ & = + $ # met rust, en dat is de meest voorkomende oorzaak van een kapotte query string als je het op één waarde loslaat.

Moet een spatie %20 of + zijn?

%20 overal, behalve in een application/x-www-form-urlencoded body of een query string die uit een formulier komt, waar allebei werken. In een padsegment of een fragment is %20 de enige juiste vorm.

Is percent-encoding een beveiligingsmaatregel?

Nee. Iedereen kan het zonder sleutel terugdraaien, en het lost één probleem op: willekeurige tekens heel door een URL krijgen. Een gedecodeerde waarde moet nog steeds gevalideerd worden voordat hij bij SQL, HTML of een shell komt.

Wordt wat ik hier plak geüpload?

Nee. Alles draait in je browser, zonder netwerkverzoek. De tekst komt ook niet in de adresbalk: de modus en de richting zijn deelbaar in de link, de inhoud niet, want een query string is precies het soort ding dat een token bevat dat je niet in je browsergeschiedenis wilt.