Caratteri ammessi nel parametro GET

Quali caratteri sono ammessi nei parametri GET senza codificare o sfuggire a loro? 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:

  • az (AZ)
  • 0-9
  • _

È questa la lista completa o ci sono caratteri aggiuntivi permessi?

Spero che puoi aiutarmi. Grazie in anticipo!

    Ci sono caratteri riservati , che hanno un significato riservato, quelli sono delimitatori – :/?#[]@ – e subdelimiters – !$&'()*+,;=

    C’è anche un set di caratteri chiamati caratteri non riservati – alfanumerici e -._~ – che non devono essere codificati.

    Ciò significa che tutto ciò che non appartiene ai caratteri non riservati impostati dovrebbe essere codificato in%, quando non hanno un significato speciale (ad esempio quando viene passato come parte del parametro GET ) .

    Vedi anche RFC3986: URI (Uniform Resource Identifier): syntax generica

    Da RFC 1738 in cui sono consentiti i caratteri negli URL:

    Solo i caratteri alfanumerici, i caratteri speciali “$ -_. +! * ‘(),” E i caratteri riservati utilizzati per i loro scopi riservati possono essere utilizzati non codificati all’interno di un URL.

    I caratteri riservati sono “;”, “/”, “?”, “:”, “@”, “=” E “&”, il che significa che sarà necessario codificarli URL se si desidera utilizzarli.

    Ho eseguito un test utilizzando la barra degli indirizzi di Chrome e un $QUERY_STRING in bash e $QUERY_STRING osservato quanto segue:

    [email protected]$%^&*()-_=+[{]}\|;:',./? e grave (backtick) sono passati come testo in chiaro.

    , " , < e > vengono convertiti rispettivamente in %20 , %22 , %3C e %3E .

    # è ignorato, poiché è usato dall'ancora vecchia.

    Personalmente, direi mordere il proiettile e codificare con base64 🙂

    Caratteri alfanumerici e tutti

    ~ - _ . ! * ' ( ) ,

    sono validi all’interno di un URL.

    Tutti gli altri personaggi devono essere codificati.

    Tutte le regole riguardanti la codifica degli URI (che contiene URN e URL) sono specificate nella RFC1738 e nella RFC3986, ecco un TL; DR di questi documenti lunghi e noiosi:

    La codifica percentuale, nota anche come codifica URL, è un meccanismo per codificare le informazioni in un URI in determinate circostanze. I caratteri consentiti in un URI sono riservati o non riservati. I personaggi riservati sono quei personaggi che a volte hanno un significato speciale, ma non sono gli unici caratteri che necessitano di codifica.

    Ci sono 66 caratteri senza riserva che non richiedono alcuna codifica: abcdefghiklmopqrstuvwABCDEFGHIKLMOPQRSTUVWXYZ0123456789-_.~

    Ci sono 18 caratteri riservati che devono essere codificati:! !*'();:@&=+$,/?#[] , E tutti gli altri caratteri devono essere codificati.

    Per codificare in percentuale un carattere, è sufficiente concatenare “%” e il relativo valore ASCII in esadecimale. Le funzioni php “urlencode” e “rawurlencode” fanno questo lavoro per te.

    La domanda chiede quali caratteri sono consentiti nei parametri GET senza codificare o sfuggirli .

    In base a RFC3986 (syntax URL generale) e RFC7230, sezione 2.7.1 (syntax URL HTTP / S), gli unici caratteri necessari per la codifica percentuale sono quelli esterni al set di query , vedere la definizione seguente.

    Tuttavia, ci sono specifiche aggiuntive come HTML5, moduli Web e la ricerca indicizzata obsoleta , raccomandazione W3C. Questi documenti aggiungono un significato speciale ad alcuni caratteri, in particolare, a simboli come = & +; .

    Altre risposte suggeriscono che la maggior parte dei caratteri riservati dovrebbe essere codificata, incluso “/” “?”. Non è corretto In effetti, la sezione 3.4 della RFC3986 sconsiglia la codifica percentuale “/” “?” personaggi.

    a volte è meglio per l’usabilità evitare la codifica percentuale di quei caratteri.

    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 corrispondente carattere dell’ottetto è esterno al 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 separatori chiave = valore .

    La codifica di altri caratteri è consentita ma non necessaria.

    "." | "!" | "~" | "*" | "'" | "(" | ")" "." | "!" | "~" | "*" | "'" | "(" | ")" sono accettabili [RFC2396] . In realtà, qualsiasi cosa può essere in un parametro GET se è codificata correttamente.