2009-12-06 14 views
143

Qualcuno conosce l'elenco completo di caratteri che possono essere utilizzati all'interno di un GET senza essere codificati? Al momento sto usando A-Z a-z e 0-9 ... ma sto cercando di trovare l'elenco completo.Caratteri consentiti in un URL

mi interessa in se v'è una specifica rilasciato per il fino a venire aggiunta di cinese, arabo url (come, ovviamente, che avrà un grande impatto sulla mia domanda)

+3

I caratteri consentiti in un URI sono o riservati '* '();:!?. @ & = + $,/# []' O senza riserve 'A-Za-z0-9_ ~ - '(o un carattere percentuale'% 'come parte di una codifica percentuale) – Mikl

+0

In MySQL io uso questo 'REGEXP' [^] A-Za-z0-9_. ~! * ''();: @ & = + $, /? # [% -] + ''per trovare la stringa dell'URL con caratteri non validi. Forse è utile anche per qualcun altro. – Mikl

risposta

138

Da specifica RFC 1738:

Così, solo caratteri alfanumerici, i caratteri speciali "$-_.+!*'(),", e caratteri riservati utilizzati per i loro scopi riservati possono essere utilizzati non codificata all'interno di un URL.

EDIT: Come @Jukka K. Korpela sottolinea correttamente, questo RFC è stato aggiornato da RFC 3986. Questo ha ampliato e chiarito i caratteri validi per l'host, sfortunatamente non è facilmente copiato e incollato, ma farò del mio meglio.

In primo ordine trovati:

host  = IP-literal/IPv4address/reg-name 

IP-literal = "[" (IPv6address/IPvFuture ) "]" 

IPvFuture = "v" 1*HEXDIG "." 1*(unreserved/sub-delims/":") 

IPv6address =   6(h16 ":") ls32 
       /      "::" 5(h16 ":") ls32 
       /[    h16 ] "::" 4(h16 ":") ls32 
       /[ *1(h16 ":") h16 ] "::" 3(h16 ":") ls32 
       /[ *2(h16 ":") h16 ] "::" 2(h16 ":") ls32 
       /[ *3(h16 ":") h16 ] "::" h16 ":" ls32 
       /[ *4(h16 ":") h16 ] "::"    ls32 
       /[ *5(h16 ":") h16 ] "::"    h16 
       /[ *6(h16 ":") h16 ] "::" 

ls32  = (h16 ":" h16)/IPv4address 
        ; least-significant 32 bits of address 

h16   = 1*4HEXDIG 
       ; 16 bits of address represented in hexadecimal 

IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet 

dec-octet = DIGIT     ; 0-9 
      /%x31-39 DIGIT   ; 10-99 
      /"1" 2DIGIT   ; 100-199 
      /"2" %x30-34 DIGIT  ; 200-249 
      /"25" %x30-35   ; 250-255 

reg-name = *(unreserved/pct-encoded/sub-delims) 

unreserved = ALPHA/DIGIT/"-"/"."/"_"/"~"  <---This seems like a practical shortcut, most closely resembling original answer 

reserved = gen-delims/sub-delims 

gen-delims = ":"/"/"/"?"/"#"/"["/"]"/"@" 

sub-delims = "!"/"$"/"&"/"'"/"("/")" 
      /"*"/"+"/","/";"/"=" 

pct-encoded = "%" HEXDIG HEXDIG 
+1

Che ne dici di barra? –

+5

@Tim barra è un carattere riservato, quindi, se viene utilizzato per il suo scopo riservato (delineare percorsi, delineazione del protocollo ...), quindi non ha bisogno di escape. Altrimenti, lo fa. – Myles

+3

Le regole di sintassi generica di RFC 1738 sono state obsolete nel 1998. –

37

i caratteri consentiti in un URI anche sono o riservati o senza riserve (o un carattere di percentuale come parte di una percentuale di codifica)

http://en.wikipedia.org/wiki/Percent-encoding#Types_of_URI_characters

dice che questi sono RFC 3986unres caratteri erved (sec. 2.3) e caratteri riservati (sez. 2.2) se hanno bisogno di mantenere il loro significato speciale. E anche un carattere percentuale come parte di una codifica percentuale.

+5

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. –

+0

@ j.a.estevan Citazione dal documento collegato: 'I caratteri consentiti in un URI sono riservati o non riservati (o un carattere percentuale come parte di una codifica percentuale)' – Mikl

10

Da here

Così, solo caratteri alfanumerici, i caratteri speciali $-_.+!*'(), e caratteri riservati utilizzati per i loro scopi riservati possono essere utilizzati non codificata all'interno di un URL.

3

Il cambiamento imminente è per i nomi di dominio cinesi, arabi non URI. Gli URI internazionalizzati sono chiamati IRI e sono definiti in RFC 3987. Tuttavia, avendo detto che mi raccomando di non farlo da solo ma facendo affidamento su una libreria esistente, testata poiché ci sono molte scelte di codifica/decodifica URI e ciò che è considerato sicuro dalle specifiche, rispetto a ciò che è sicuro dall'uso effettivo (browser) .

17

L'elenco completo dei 66 caratteri senza riserve è in RFC3986, qui: http://tools.ietf.org/html/rfc3986#section-2.3

Questo è un qualsiasi carattere nel seguente set:

[A-Za-z0-9_.-~] 
+1

Puoi anche usare quelli riservati. – Qwerty

+0

L'obsoleta RFC1738 elencava '{}^\ ~' e 'backtick' come non sicuri. E RFC3986 elenca \ come non sicuro a causa del file system. Ciò significa che potrebbe essere usato anche '{} ^'. – mgutt

3

RFC3986 definisce due set di caratteri che è possibile utilizzare in un URI:

  • caratteri riservati: :/?#[]@!$&'()*+,;=

    riservati = generatori delims/sub-delims

    generatori delims = ":" "?"/"/"// "#"/"["/"]"/"@"

    sub-delim = "!"/"$"/"&"/"'"/"("/")"/"*"/"+"/","/";"/"="

    Lo scopo dei caratteri riservati è fornire un insieme di caratteri delimitanti che sono distinguibili da altri dati all'interno di un URI. Gli URI che differiscono nella sostituzione di un carattere riservato con il corrispondente ottetto codificato in percentuale non sono equivalenti.

  • Personaggi non numerata: A-Za-z0-9-_.~

    senza riserve = ALPHA/DIGIT/"-"/""./"_"/"~"

    I caratteri consentiti in un URI ma che non hanno uno scopo riservato sono chiamati senza riserva.

5

ho provato richiedendo il mio sito web (Apache) con tutti i caratteri disponibili sulla mia tastiera tedesco come parametro URL:

http://example.com/?^1234567890ß´qwertzuiopü+asdfghjklöä#<yxcvbnm,.-°!"§$%&/()=? `QWERTZUIOPÜ*ASDFGHJKLÖÄ\'>YXCVBNM;:_²³{[]}\|µ@€~ 

Questi non sono stati codificati:

^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.-!/()=?`*;:_{}[]\|~ 

Non codificato dopo urlencode():

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_ 

Non codificato dopo rawurlencode():

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~ 

Nota: Prima di PHP 5.3.0 rawurlencode() codificato ~ a causa di RFC 1738. Ma questo è stato sostituito da RFC 3986 quindi è sicuro da usare, ora. Ma io non capisco perché ad esempio {} sono codificati attraverso rawurlencode() perché non sono menzionati nella RFC 3986.

Un'ulteriore prova che ho fatto è stato per quanto riguarda auto-linking nei testi di posta. Ho testato Mozilla Thunderbird, aol.com, outlook.com, gmail.com, gmx.de e yahoo.de e loro URL completi legati contenenti questi caratteri:

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~+#,%&=*;:@ 

Naturalmente il ? era legata, anche, ma solo se è stato usato una volta.

Alcune persone suggeriscono ora di utilizzare solo i caratteri rawurlencode(), ma avete mai sentito che qualcuno ha avuto problemi ad aprire questi siti Web?

Asterisk
http://wayback.archive.org/web/*/http://google.com

Colon
https://en.wikipedia.org/wiki/Wikipedia:About

Inoltre
https://plus.google.com/+google

A segno, Colon, virgola e punto esclamativo
https://www.google.com/maps/place/USA/@36.2218457,...

A causa di ciò questi caratteri dovrebbe essere codificata utilizzabile senza problemi. Ovviamente non si dovrebbe usare &; a causa di sequenze di codifica come &amp;. Lo stesso motivo è valido per % poiché viene utilizzato per codificare i caratteri in generale. E = come assegna un valore a un nome di parametro.

Infine vorrei dire il suo ok per utilizzare questi non codificata:

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~!+,*:@ 

ma se vi aspettate generato in modo casuale URL non si dovrebbe usare .!, perché quelli segnare la fine di una frase e alcune applicazioni di posta elettronica non si auto -collega l'ultimo carattere dell'URL. Esempio:

Visit http://example.com/foo=bar! ! 
Problemi correlati