urlencode vs rawurlencode?


380

Se voglio creare un URL usando una variabile, ho due opzioni per codificare la stringa. urlencode()e rawurlencode().

Quali sono esattamente le differenze e quale è preferito?


1
Mi piacerebbe davvero vedere alcuni motivi per scegliere l'uno sull'altro (ad es. Problemi che potrebbero essere incontrati con l'uno o l'altro), io (e mi aspetto che altri) vogliano essere in grado di sceglierne uno e usarlo per sempre con il almeno confusione, quindi ho iniziato una taglia su questa domanda.
Kzqai,

29
@Tchalvak: se vuoi sceglierne solo uno, scegli rawurlencode. Raramente ti imbatterai in un sistema che soffoca quando vengono dati spazi codificati come %20, mentre i sistemi che soffocano su spazi codificati come +sono più comuni.
Anomie il

Risposte:


326

Dipenderà dal tuo scopo. Se l'interoperabilità con altri sistemi è importante, allora sembra che rawurlencode sia la strada da percorrere. L'unica eccezione sono i sistemi legacy che prevedono che la stringa di query segua lo stile di codifica del modulo degli spazi codificati come + anziché% 20 (nel qual caso è necessario il codice url).

rawurlencode segue RFC 1738 prima di PHP 5.3.0 e RFC 3986 in seguito (vedi http://us2.php.net/manual/en/function.rawurlencode.php )

Restituisce una stringa in cui tutti i caratteri non alfanumerici tranne -_. ~ Sono stati sostituiti con un segno percentuale (%) seguito da due cifre esadecimali. Questa è la codifica descritta in »RFC 3986 per proteggere i caratteri letterali dall'interpretazione di speciali delimitatori di URL e per proteggere gli URL dall'essere manipolati dai media di trasmissione con conversioni di caratteri (come alcuni sistemi di posta elettronica).

Nota su RFC 3986 vs 1738. rawurlencode prima di php 5.3 codificava il carattere tilde ( ~) secondo RFC 1738. A partire da PHP 5.3, tuttavia, rawurlencode segue RFC 3986 che non richiede la codifica dei caratteri tilde.

urlencode codifica gli spazi come segni più (non %20come fatto in rawurlencode) (vedi http://us2.php.net/manual/en/function.urlencode.php )

Restituisce una stringa in cui tutti i caratteri non alfanumerici tranne -_. sono stati sostituiti con un segno percentuale (%) seguito da due cifre esadecimali e spazi codificati come segni più (+). Viene codificato nello stesso modo in cui vengono codificati i dati pubblicati da un modulo WWW, ovvero come nel tipo di supporto application / x-www-form-urlencoded. Ciò differisce dalla codifica »RFC 3986 (vedi rawurlencode ()) in quanto per ragioni storiche gli spazi sono codificati come segni più (+).

Ciò corrisponde alla definizione per application / x-www-form-urlencoded in RFC 1866 .

Letture aggiuntive:

Puoi anche consultare la discussione su http://bytes.com/groups/php/5624-urlencode-vs-rawurlencode .

Inoltre, RFC 2396 merita una visita. RFC 2396 definisce una sintassi URI valida. La parte principale a cui siamo interessati è dal componente di query 3.4:

All'interno di un componente di query, i caratteri sono riservati.";", "/", "?", ":", "@",
"&", "=", "+", ",", and "$"

Come puoi vedere, +è un carattere riservato nella stringa di query e quindi dovrebbe essere codificato secondo RFC 3986 (come in rawurlencode).


27
Quindi quale è preffered?
Gary Willoughby,

79
rawurlencode. andare con lo standard in questo caso. urlencode è conservato solo per uso legacy
Jonathan Fingland,

2
Grazie, è quello che pensavo, volevo solo un secondo parere prima di iniziare ad aggiornare un sacco di codice.
Gary Willoughby,

3
Penso che sia rawurlencode che non codifica gli spazi come segni più ma come% 20s
BigName

2
@Pindatjuh: la parte che hai citato L'unica eccezione sono i sistemi legacy che prevedono che la stringa di query segua lo stile di codifica del modulo degli spazi codificati come + anziché% 20 (nel qual caso è necessario urlencode) significa che mentre rawurlencode è giusto per la maggior parte delle situazioni , alcuni sistemi prevedono che gli spazi vengano codificati come + (segno più). Per tali sistemi, urlencode è la scelta migliore.
Jonathan Fingland il

213

La prova è nel codice sorgente di PHP.

Ti guiderò attraverso un rapido processo su come scoprire questo genere di cose da solo in futuro ogni volta che vuoi. Abbi pazienza, ci sarà un sacco di codice sorgente C su cui puoi scorrere (lo spiego). Se vuoi rispolverare qualche C, un buon punto di partenza è il nostro SO wiki .

Scarica il sorgente (o usa http://lxr.php.net/ per sfogliarlo online), grep tutti i file per il nome della funzione, troverai qualcosa del genere:

PHP 5.3.6 (più recente al momento della scrittura), descrive le due funzioni nel loro codice C nativo nel file url.c .

Rawurlencode ()

PHP_FUNCTION(rawurlencode)
{
    char *in_str, *out_str;
    int in_str_len, out_str_len;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &in_str,
                              &in_str_len) == FAILURE) {
        return;
    }

    out_str = php_raw_url_encode(in_str, in_str_len, &out_str_len);
    RETURN_STRINGL(out_str, out_str_len, 0);
}

UrlEncode ()

PHP_FUNCTION(urlencode)
{
    char *in_str, *out_str;
    int in_str_len, out_str_len;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &in_str,
                              &in_str_len) == FAILURE) {
        return;
    }

    out_str = php_url_encode(in_str, in_str_len, &out_str_len);
    RETURN_STRINGL(out_str, out_str_len, 0);
}

Okay, quindi cosa c'è di diverso qui?

Entrambi in sostanza chiamano rispettivamente due diverse funzioni interne: php_raw_url_encode e php_url_encode

Quindi vai a cercare quelle funzioni!

Vediamo php_raw_url_encode

PHPAPI char *php_raw_url_encode(char const *s, int len, int *new_length)
{
    register int x, y;
    unsigned char *str;

    str = (unsigned char *) safe_emalloc(3, len, 1);
    for (x = 0, y = 0; len--; x++, y++) {
        str[y] = (unsigned char) s[x];
#ifndef CHARSET_EBCDIC
        if ((str[y] < '0' && str[y] != '-' && str[y] != '.') ||
            (str[y] < 'A' && str[y] > '9') ||
            (str[y] > 'Z' && str[y] < 'a' && str[y] != '_') ||
            (str[y] > 'z' && str[y] != '~')) {
            str[y++] = '%';
            str[y++] = hexchars[(unsigned char) s[x] >> 4];
            str[y] = hexchars[(unsigned char) s[x] & 15];
#else /*CHARSET_EBCDIC*/
        if (!isalnum(str[y]) && strchr("_-.~", str[y]) != NULL) {
            str[y++] = '%';
            str[y++] = hexchars[os_toascii[(unsigned char) s[x]] >> 4];
            str[y] = hexchars[os_toascii[(unsigned char) s[x]] & 15];
#endif /*CHARSET_EBCDIC*/
        }
    }
    str[y] = '\0';
    if (new_length) {
        *new_length = y;
    }
    return ((char *) str);
}

E, naturalmente, php_url_encode:

PHPAPI char *php_url_encode(char const *s, int len, int *new_length)
{
    register unsigned char c;
    unsigned char *to, *start;
    unsigned char const *from, *end;

    from = (unsigned char *)s;
    end = (unsigned char *)s + len;
    start = to = (unsigned char *) safe_emalloc(3, len, 1);

    while (from < end) {
        c = *from++;

        if (c == ' ') {
            *to++ = '+';
#ifndef CHARSET_EBCDIC
        } else if ((c < '0' && c != '-' && c != '.') ||
                   (c < 'A' && c > '9') ||
                   (c > 'Z' && c < 'a' && c != '_') ||
                   (c > 'z')) {
            to[0] = '%';
            to[1] = hexchars[c >> 4];
            to[2] = hexchars[c & 15];
            to += 3;
#else /*CHARSET_EBCDIC*/
        } else if (!isalnum(c) && strchr("_-.", c) == NULL) {
            /* Allow only alphanumeric chars and '_', '-', '.'; escape the rest */
            to[0] = '%';
            to[1] = hexchars[os_toascii[c] >> 4];
            to[2] = hexchars[os_toascii[c] & 15];
            to += 3;
#endif /*CHARSET_EBCDIC*/
        } else {
            *to++ = c;
        }
    }
    *to = 0;
    if (new_length) {
        *new_length = to - start;
    }
    return (char *) start;
}

Un po 'di conoscenza prima di andare avanti, EBCDIC è un altro set di caratteri , simile a ASCII, ma un concorrente totale. PHP tenta di affrontare entrambi. Ma fondamentalmente, questo significa che il byte EBCDIC 0x4c non è Lin ASCII, in realtà è un <. Sono sicuro che vedi la confusione qui.

Entrambe queste funzioni gestiscono EBCDIC se il web server lo ha definito.

Inoltre, entrambi utilizzano una matrice di caratteri (tipo di stringa di hexcharsricerca ) per ottenere alcuni valori, la matrice è descritta come tale:

/* rfc1738:

   ...The characters ";",
   "/", "?", ":", "@", "=" and "&" are the characters which may be
   reserved for special meaning within a scheme...

   ...Thus, only alphanumerics, the special characters "$-_.+!*'(),", and
   reserved characters used for their reserved purposes may be used
   unencoded within a URL...

   For added safety, we only leave -_. unencoded.
 */

static unsigned char hexchars[] = "0123456789ABCDEF";

Oltre a ciò, le funzioni sono davvero diverse e le spiegherò in ASCII ed EBCDIC.

Differenze in ASCII:

UrlEncode:

  • Calcola una lunghezza iniziale / finale della stringa di input, alloca memoria
  • Cammina attraverso un ciclo while, con incrementi fino a raggiungere la fine della stringa
  • Afferra il personaggio attuale
  • Se il carattere è uguale al carattere ASCII 0x20 (ovvero uno "spazio"), aggiungi un +segno alla stringa di output.
  • Se non è uno spazio, e non è nemmeno alfanumerico ( isalnum(c)), e inoltre non è e _, -o .carattere, quindi, produciamo un %segno nella posizione 0 dell'array, facciamo un array cercando l' hexcharsarray per una ricerca os_toasciidell'array ( un array di Apache che traduce char in codice esadecimale) per la chiave di c(il carattere attuale), spostiamo quindi bit a destra di 4, assegniamo quel valore al carattere 1 e alla posizione 2 assegniamo la stessa ricerca, tranne che preformiamo un logico e per vedere se il valore è 15 (0xF), e in tal caso restituisce un 1 o uno 0. Alla fine, finirai con qualcosa codificato.
  • Se finisce non è uno spazio, è alfanumerico o uno dei _-.caratteri, produce esattamente quello che è.

rawurlencode:

  • Alloca memoria per la stringa
  • Passa da uno all'altro in base alla lunghezza fornita nella chiamata di funzione (non calcolata in funzione come con URLENCODE).

Nota: molti programmatori probabilmente non hanno mai visto un ciclo for iterare in questo modo, è un po 'hacker e non la convenzione standard usata con la maggior parte dei for-loop, presta attenzione, assegna xe y, controlla l'uscita per lenraggiungere lo 0 e incrementa entrambi xe y. Lo so, non è quello che ti aspetteresti, ma è un codice valido.

  • Assegna il personaggio attuale a una posizione del personaggio corrispondente in str.
  • Verifica se il carattere attuale è alfanumerico o uno dei _-.caratteri e, in caso contrario, eseguiamo quasi la stessa assegnazione di URLENCODE in cui preforma le ricerche, tuttavia, aumentiamo in modo diverso, utilizzando y++anziché anziché to[1], perché le stringhe vengono costruite in diversi modi, ma alla fine raggiungono lo stesso obiettivo.
  • Quando il ciclo è terminato e la lunghezza è passata, termina effettivamente la stringa, assegnando il \0byte.
  • Restituisce la stringa codificata.

differenze:

  • UrlEncode verifica lo spazio, assegna un segno +, RawURLEncode no.
  • UrlEncode non assegna un \0byte alla stringa, RawUrlEncode lo fa (potrebbe trattarsi di un punto controverso)
  • Esse differiscono in modo diverso, si potrebbe essere inclini a traboccare di stringhe malformate, sto solo suggerendo questo e non ho effettivamente indagato.

Fondamentalmente ripetono diversamente, si assegna un segno + in caso di ASCII 20.

Differenze in EBCDIC:

UrlEncode:

  • Stessa configurazione dell'iterazione come con ASCII
  • Sto ancora traducendo il carattere "spazio" in un segno + . Nota-- Penso che questo debba essere compilato in EBCDIC o finirai con un bug? Qualcuno può modificarlo e confermarlo?
  • Verifica se il carattere attuale è un carattere prima 0, ad eccezione di un .o -, OR minore di Ama maggiore di char 9, OR maggiore di Ze minore di ama non a _. O maggiore di z(sì, EBCDIC è un po 'incasinato con cui lavorare). Se corrisponde a uno di questi, esegui una ricerca simile a quella della versione ASCII (semplicemente non richiede una ricerca in os_toascii).

rawurlencode:

  • Stessa configurazione dell'iterazione come con ASCII
  • Stesso controllo descritto nella versione EBCDIC di URL Encode, con l'eccezione che se è maggiore di z, si esclude ~dalla codifica URL.
  • Stessa assegnazione di ASCII RawUrlEncode
  • Ancora aggiungendo il \0byte alla stringa prima di restituirlo.

Sommario generale

  • Entrambi usano la stessa tabella di ricerca hexchars
  • URIEncode non termina una stringa con \ 0, raw lo fa.
  • Se lavori in EBCDIC, suggerirei di utilizzare RawUrlEncode, poiché gestisce ~UrlEncode ( questo è un problema segnalato ). Vale la pena notare che ASCII e EBCDIC 0x20 sono entrambi spazi.
  • Iterano in modo diverso, uno può essere più veloce, uno può essere incline alla memoria o agli exploit basati su stringa.
  • URIEncode crea uno spazio +, RawUrlEncode crea uno spazio %20tramite ricerche di array.

Disclaimer: non tocco C da anni e non guardo EBCDIC da molto tempo. Se sbaglio da qualche parte, fammi sapere.

Implementazioni suggerite

Sulla base di tutto ciò, rawurlencode è la strada da percorrere per la maggior parte del tempo. Come vedi nella risposta di Jonathan Fingland, segui la maggior parte dei casi. Si occupa del moderno schema per i componenti URI, dove come urlencode fa le cose alla vecchia maniera, dove + significava "spazio".

Se stai cercando di convertire tra il vecchio formato e i nuovi formati, assicurati che il tuo codice non esca e trasforma qualcosa che è un segno + decodificato in uno spazio accidentalmente con doppia codifica o scenari simili "oops" attorno a questo spazio / 20% / + problema.

Se stai lavorando su un sistema più vecchio con un software più vecchio che non preferisce il nuovo formato, mantieni il codice url, tuttavia, credo che% 20 sarà effettivamente retrocompatibile, poiché secondo il vecchio standard% 20 funzionava, semplicemente non lo era preferito. Provalo se sei pronto per giocare, facci sapere come ha funzionato per te.

Fondamentalmente, dovresti rimanere con raw, a meno che il tuo sistema EBCDIC non ti odia davvero. La maggior parte dei programmatori non si imbatterà mai in EBCDIC su alcun sistema realizzato dopo l'anno 2000, forse persino il 1990 (questo è un passo avanti, ma probabilmente secondo me).


Non ho mai dovuto preoccuparmi della doppia codifica, dopo tutto, dovrei sapere cosa ho codificato poiché sono io a fare la codifica che penserei. Da quando ho decodificato tutto ciò che ricevo con una modalità di compatibilità che sa come trattare + per lo spazio, non ho mai incontrato i problemi che cerchi di avvertire qui. Posso capire guardando la fonte se non sappiamo cosa fa qualcosa, ma cosa abbiamo imparato esattamente qui che non sapevamo già semplicemente eseguendo entrambe le funzioni. So di essere di parte, ma non posso fare a meno di pensare che sia andato molto oltre. Complimenti per lo sforzo però! =)
nickl-

2
+1, per questa parte: "Credo che% 20 sarà effettivamente retrocompatibile, dato che secondo il vecchio standard% 20 funzionava, semplicemente non era preferito"
Gras Double

3
Buona risposta, ma forse un po 'eccessivo?
Rinogo,

38
echo rawurlencode('http://www.google.com/index.html?id=asd asd');

i rendimenti

http%3A%2F%2Fwww.google.com%2Findex.html%3Fid%3Dasd%20asd

mentre

echo urlencode('http://www.google.com/index.html?id=asd asd');

i rendimenti

http%3A%2F%2Fwww.google.com%2Findex.html%3Fid%3Dasd+asd

La differenza è il asd%20asdvsasd+asd

urlencode differisce da RFC 1738 codificando gli spazi come +anziché%20


28

Un motivo pratico per scegliere l'uno rispetto all'altro è se si intende utilizzare il risultato in un altro ambiente, ad esempio JavaScript.

In PHP urlencode('test 1')ritorna 'test+1'mentre rawurlencode('test 1')ritorna 'test%201'come risultato.

Ma se hai bisogno di "decodificare" questo in JavaScript usando la funzione decodeURI () allora decodeURI("test+1")ti darà "test+1"mentre decodeURI("test%201")ti darà "test 1"come risultato.

In altre parole, lo spazio ("") codificato da urlencode in più ("+") in PHP non verrà decodificato correttamente da decodeURI in JavaScript.

In tali casi dovrebbe essere utilizzata la funzione PHP rawurlencode .


6
Questa è di gran lunga la risposta migliore che abbia mai visto. Fornisce un suggerimento per l'uso, indietro da un esempio del mondo reale. Inoltre, è conciso.
dotancohen,

È un bell'esempio, anche se preferisco json_encodee JSON.parseper quello scopo.
Fabrício Matté,

21

Credo che gli spazi debbano essere codificati come:

  • %20 quando utilizzato all'interno del componente percorso URL
  • +se utilizzato all'interno del componente della stringa di query URL o dei dati del modulo (vedere 17.13.4 Tipi di contenuto del modulo )

L'esempio seguente mostra l'uso corretto di rawurlencodee urlencode:

echo "http://example.com"
    . "/category/" . rawurlencode("latest songs")
    . "/search?q=" . urlencode("lady gaga");

Produzione:

http://example.com/category/latest%20songs/search?q=lady+gaga

Cosa succede se si codificano il percorso e si interrogano i componenti della stringa al contrario? Per il seguente esempio:

http://example.com/category/latest+songs/search?q=lady%20gaga
  • Il server web cercherà la directory latest+songsanzichélatest songs
  • Il parametro della stringa di query qconterràlady gaga

2
"Il parametro della stringa di query qconterrà lady gaga" Cos'altro altrimenti contenere? Il parametro query qsembra avere lo stesso valore passato $_GETall'array indipendentemente dall'uso rawurlencodeo urlencodein PHP 5.2+. Tuttavia, urlencodecodifica nel application/x-www-form-urlencodedformato predefinito per le richieste GET, quindi seguirò il tuo approccio. +1
Fabrício Matté,

2
Volevo chiarire che entrambi +e %20sono decodificati come spazio quando utilizzati nelle stringhe di query.
Salman,

5

La differenza sta nei valori di ritorno, ovvero:

urlencode () :

Restituisce una stringa in cui tutti i caratteri non alfanumerici tranne -_. sono stati sostituiti con un segno percentuale (%) seguito da due cifre esadecimali e spazi codificati come segni più (+). Viene codificato nello stesso modo in cui vengono codificati i dati pubblicati da un modulo WWW, ovvero come nel tipo di supporto application / x-www-form-urlencoded. Ciò differisce dalla codifica »RFC 1738 (vedi rawurlencode ()) in quanto per ragioni storiche, gli spazi sono codificati come segni più (+).

rawurlencode () :

Restituisce una stringa in cui tutti i caratteri non alfanumerici tranne -_. sono stati sostituiti con un segno di percentuale (%) seguito da due cifre esadecimali. Questa è la codifica descritta in »RFC 1738 per proteggere i caratteri letterali dall'interpretazione di speciali delimitatori di URL e per proteggere gli URL dall'essere manipolati dai media di trasmissione con conversioni di caratteri (come alcuni sistemi di posta elettronica).

I due sono molto simili, ma quest'ultimo (rawurlencode) sostituirà gli spazi con un '%' e due cifre esadecimali, che è adatto per codificare password o simili, dove un '+' non è ad esempio:

echo '<a href="ftp://user:', rawurlencode('foo @+%/'),
     '@ftp.example.com/x.txt">';
//Outputs <a href="ftp://user:foo%20%40%2B%25%2F@ftp.example.com/x.txt">

2
L'OP chiede come sapere quale utilizzare e quando. Sapere cosa ognuno di loro fa con gli spazi non aiuta l'OP a prendere una decisione se non conosce l'importanza dei diversi valori di ritorno.
dotancohen,

5

1. Quali sono esattamente le differenze e

L'unica differenza è nel modo in cui gli spazi vengono trattati:

urlencode - basato sull'implementazione legacy converte gli spazi in +

rawurlencode - basato su RFC 1738 traduce gli spazi in% 20

Il motivo della differenza è perché + è riservato e valido (non codificato) negli URL.

2. quale è preferito?

Mi piacerebbe davvero vedere alcuni motivi per sceglierne uno rispetto all'altro ... Voglio essere in grado di sceglierne uno e usarlo per sempre con il minimo sforzo.

Abbastanza giusto, ho una strategia semplice che seguo quando prenderò queste decisioni che condividerò con voi nella speranza che possa essere d'aiuto.

Penso che sia stata la specifica HTTP / 1.1 RFC 2616 che ha richiesto " Applicazioni tolleranti "

I client DOVREBBERO essere tolleranti nell'analisi della Riga di stato e tolleranti dei server durante l'analisi della Riga di richiesta.

Di fronte a domande come queste, la strategia migliore è sempre quella di consumare il più possibile e produrre ciò che è conforme agli standard.

Quindi il mio consiglio è quello di utilizzare rawurlencodeper produrre stringhe codificate RFC 1738 conformi agli standard e utilizzare urldecodeper essere retrocompatibili e soddisfare qualsiasi cosa tu possa incontrare per consumare.

Ora potresti semplicemente crederci sulla parola, ma proviamo che dovremmo ...

php > $url = <<<'EOD'
<<< > "Which, % of Alice's tasks saw $s @ earnings?"
<<< > EOD;
php > echo $url, PHP_EOL;
"Which, % of Alice's tasks saw $s @ earnings?"
php > echo urlencode($url), PHP_EOL;
%22Which%2C+%25+of+Alice%27s+tasks+saw+%24s+%40+earnings%3F%22
php > echo rawurlencode($url), PHP_EOL;
%22Which%2C%20%25%20of%20Alice%27s%20tasks%20saw%20%24s%20%40%20earnings%3F%22
php > echo rawurldecode(urlencode($url)), PHP_EOL;
"Which,+%+of+Alice's+tasks+saw+$s+@+earnings?"
php > // oops that's not right???
php > echo urldecode(rawurlencode($url)), PHP_EOL;
"Which, % of Alice's tasks saw $s @ earnings?"
php > // now that's more like it

Sembrerebbe che PHP avesse avuto esattamente questo in mente, anche se non ho mai incontrato nessuno che rifiuta uno dei due formati, non riesco a pensare a una strategia migliore da adottare come strategia defacto, vero?

nJoy!


4

urlencode : differisce dalla codifica »RFC 1738 (vedi rawurlencode ()) in quanto per ragioni storiche gli spazi sono codificati come segni più (+).


2

Spazi codificati come %20vs.+

Il motivo principale che ho visto usare rawurlencode()nella maggior parte dei casi è perché urlencodecodifica gli spazi di testo come +(segni più) dove rawurlencodeli codifica come quelli comunemente visti %20:

echo urlencode("red shirt");
// red+shirt

echo rawurlencode("red shirt");
// red%20shirt

Ho visto specificamente alcuni endpoint API che accettano query di testo codificate che si aspettano di vedere %20per uno spazio e, di conseguenza, falliscono se viene utilizzato un segno più. Ovviamente questo differirà tra le implementazioni API e il tuo chilometraggio potrebbe variare.


1

Credo che urlencode sia per i parametri di query, mentre rawurlencode è per i segmenti di percorso. Ciò è dovuto principalmente ai %20segmenti del percorso rispetto +ai parametri della query. Vedi questa risposta che parla degli spazi: Quando codificare lo spazio in più (+) o% 20?

Tuttavia %20ora funziona anche nei parametri di query, motivo per cui rawurlencode è sempre più sicuro. Tuttavia, il segno più tende ad essere utilizzato laddove l'esperienza dell'utente di modifica e leggibilità dei parametri della query contano.

Si noti che questo significa che rawurldecodenon si decodifica +in spazi ( http://au2.php.net/manual/en/function.rawurldecode.php ). Questo è il motivo per cui il $ _GET viene sempre passato automaticamente attraverso urldecode, il che significa che +e %20sono entrambi decodificati in spazi.

Se vuoi che la codifica e la decodifica siano coerenti tra input e output e hai scelto di utilizzare sempre +e non %20per i parametri di query, allora urlencodeva bene per i parametri di query (chiave e valore).

La conclusione è:

Segmenti di percorso: utilizzare sempre rawurlencode / rawurldecode

Parametri query: per la decodifica utilizzare sempre urldecode (fatto automaticamente), per la codifica, sia rawurlencode che urlencode vanno bene, basta sceglierne uno per essere coerenti, soprattutto quando si confrontano gli URL.


0

simple * rawurlencode il percorso - percorso è la parte prima del "?" - gli spazi devono essere codificati come% 20 * urlencode la stringa di query - La stringa di query è la parte dopo "?" -spazi sono meglio codificati come "+" = rawurlencode è generalmente più compatibile

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.