Caratteri consentiti nel parametro GET
-
12-09-2019 - |
Domanda
Quali caratteri sono consentiti nei parametri GET senza codificarli o eseguirne l'escape?Intendo qualcosa del genere:
http://www.example.org/page.php?name=XYZ
Cosa puoi avere lì al posto di XYZ?Penso solo ai seguenti personaggi:
- a-z (A-Z)
- 0-9
- -
- _
Questo è l'elenco completo o sono consentiti caratteri aggiuntivi?
Spero che puoi aiutarmi.Grazie in anticipo!
Soluzione
Ci sono caratteri riservati, che hanno significati riservati, quelli sono delimitatori — :/?#[]@
— e sottodelimitatori — !$&'()*+,;=
C'è anche un set di caratteri chiamato caratteri senza riserve — caratteri alfanumerici e -._~
- che non devono essere codificati.
Ciò significa che tutto ciò che non appartiene al set di caratteri non riservati dovrebbe essere codificato in %, quando non hanno un significato speciale (ad es.quando passato come parte di GET
parametro).
Guarda anche RFC3986:Identificatore uniforme delle risorse (URI):Sintassi generica
Altri suggerimenti
La domanda chiede quali personaggi sono consentito nei parametri GET senza codificarli o eseguirne l'escape.
Secondo RFC3986 (sintassi generale dell'URL) e RFC7230, sezione 2.7.1 (Sintassi URL HTTP/S) gli unici caratteri che devi codificare in percentuale sono quelli esterni a domanda impostare, vedere la definizione di seguito.
Tuttavia, ci sono specifiche aggiuntive come HTML5, Moduli Web e la ricerca indicizzata obsoleta, Raccomandazione del W3C.Questi documenti aggiungono un significato speciale ad alcuni caratteri, in particolare a simboli come = & + ;.
Altre risposte qui suggeriscono che la maggior parte dei caratteri riservati dovrebbe essere codificata, incluso "/" "?".Non è corretto.Infatti, RFC3986, sezione 3.4 sconsiglia la codifica percentuale dei caratteri "/" "?".
A volte è meglio per l'usabilità evitare la percentuale: codificare quei personaggi.
RFC3986 definisce il componente di query come:
query = *( pchar / "/" / "?" )
pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
pct-encoded = "%" HEXDIG HEXDIG
sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
Un meccanismo di codifica percentuale viene utilizzato per rappresentare un ottetto di dati in un componente quando il carattere corrispondente di quell'ottetto è al di fuori del set consentito o viene utilizzato come delimitatore o all'interno del componente.
La conclusione è che la parte XYZ dovrebbe codificare:
special: # % = & ;
Space
out of query set: [ ]
non ASCII encodable characters
Salvo simboli speciali = &;Sono chiave=valore separatori.
La codifica di altri caratteri è consentita ma non necessaria.
RFC 1738 su cui caratteri sono ammessi in URL:
Solo caratteri alfanumerici, i caratteri speciali "$ -_. + * '()," E caratteri riservati utilizzati per i loro scopi riservati possono essere utilizzati non codificato all'interno di un URL.
I caratteri riservati sono ";", "/", ":", "@", "=" e "&", il che significa che avrebbe bisogno di URL in codice, se si desidera utilizzarli "?" .
caratteri alfanumerici e tutti
~
-
_
.
!
*
'
(
)
,
sono validi all'interno di un URL.
Tutti gli altri caratteri devono essere codificati.
ho fatto un test utilizzando la barra degli indirizzi di Chrome e di una $QUERY_STRING
in bash, e osservato quanto segue:
~!@$%^&*()-_=+[{]}\|;:',./?
e grave (backtick)
sono passati attraverso in testo semplice.
,
"
, <
e >
vengono convertiti in %20
, %22
, %3C
e %3E
rispettivamente.
#
viene ignorato, dal momento che viene utilizzato da Ye Olde ancoraggio .
Personalmente, direi che stringere i denti e codificare con Base64:)
Tutte le norme relative alla codifica delle URI (che contiene URN e URL) sono specificati nel RFC1738 e RFC3986, ecco una TL; DR di questi documenti lunghe e noiose:
percentuale di codifica, noto anche come codifica URL, è un meccanismo per codificare informazioni in un URI in determinate circostanze. I caratteri consentiti in un URI sono o riservati o senza riserve. caratteri riservati sono quei personaggi che a volte hanno un significato speciale, ma non sono gli unici personaggi che ha bisogno di codifica.
Ci sono 66 caratteri senza riserve che non hanno bisogno di qualsiasi codifica:
abcdefghiklmopqrstuvwABCDEFGHIKLMOPQRSTUVWXYZ0123456789-_.~
Ci sono 18 caratteri riservati che deve essere codificata: !*'();:@&=+$,/?#[]
, e tutti gli altri personaggi devono essere codificati
Per cento-codificare un carattere, è sufficiente concatenare "%" e il suo valore ASCII esadecimale. Le funzioni PHP "URLEncode" e "rawurlencode" fanno questo lavoro per voi.
"." | "!" | "~" | "*" | "'" | "(" | ")"
sono anche accettabili [RFC2396] . In realtà, tutto può essere in un parametro GET se è correttamente codificato.