Le parentesi quadre sono consentite negli URL?

Sono consentite le parentesi quadre negli URL?

Ho notato che Apache commons HttpClient (3.0.1) lancia una IOException, tuttavia wget e Firefox accettano parentesi quadre.

Esempio di URL:

http://example.com/path/to/file[3].html 

Il mio client HTTP incontra tali URL ma non sono sicuro se applicare patch al codice o lanciare un’eccezione (come dovrebbe essere in realtà).

RFC 3986 afferma

Un host identificato da un indirizzo letterale del protocollo Internet, versione 6 [RFC3513] o successiva, si distingue includendo il valore letterale IP tra parentesi quadre (“[” e “]”). Questo è l’unico posto in cui sono consentiti i caratteri della parentesi quadra nella syntax dell’URI.

Quindi non dovresti vedere questi URI in natura in teoria, poiché dovrebbero arrivare codificati.

So che questa domanda è un po ‘vecchia, ma volevo solo sottolineare che PHP usa parentesi per passare array in un URL.

 http://www.example.com/foo.php?bar[]=1&bar[]=2&bar[]=3 

In questo caso $_GET['bar'] conterrà array(1, 2, 3) .

Qualsiasi browser o software abilitato per il Web che accetta URL e non genera un’eccezione quando vengono introdotti caratteri speciali è quasi garantito che codifica i caratteri speciali dietro le quinte. Le parentesi graffe, le parentesi quadre, gli spazi, ecc. Hanno tutti speciali modi codificati di rappresentarli in modo da non produrre conflitti. Come per le risposte precedenti, il modo più sicuro per gestirle è codificarle tramite URL prima di consegnarle a qualcosa che proverà a risolvere l’URL.

Praticamente i soli caratteri non permessi nei nomi dei percorsi sono # e? come indicano la fine del percorso.

L’uri rfc avrà la risposta definitiva:

http://www.ietf.org/rfc/rfc1738.txt

Unsafe:

I personaggi possono essere insicuri per una serie di motivi. Il carattere dello spazio non è sicuro perché gli spazi significativi possono scomparire e spazi insignificanti possono essere introdotti quando gli URL sono trascritti o composti o sottoposti al trattamento di programmi di elaborazione testi. I caratteri “<" e ">” non sono sicuri perché vengono utilizzati come delimitatori attorno agli URL in testo libero; il segno di virgoletta (“” “) viene utilizzato per delimitare gli URL in alcuni sistemi.Il carattere” # “non è sicuro e deve essere sempre codificato perché viene utilizzato nel World Wide Web e in altri sistemi per delimitare un URL da un frammento / ancora identificatore che potrebbe seguirlo. Il carattere “%” non è sicuro perché viene utilizzato per codifiche di altri caratteri. Altri caratteri non sono sicuri poiché i gateway e altri agenti di trasporto sono talvolta in grado di modificare tali caratteri. Questi caratteri sono “{“, “} “,” | “,” \ “,” ^ “,” ~ “,” [“,”] “e” `”.

Tutti i caratteri non sicuri devono sempre essere codificati all’interno di un URL. Ad esempio, il carattere “#” deve essere codificato all’interno degli URL anche in sistemi che normalmente non si occupano di frammenti o identificatori di ancoraggio, in modo che se l’URL viene copiato in un altro sistema che li utilizza, non sarà necessario modificare il Codifica dell’URL.

La risposta è che dovrebbero essere codificati in esadecimale, ma conoscendo la legge di Postel, la maggior parte delle cose li accetterà alla lettera.

Per utilizzare la class di comuni HttpClient, si desidera esaminare la class org.apache.commons.httpclient.util.URIUtil, in particolare il metodo encode (). Usalo su URI: codifica l’URL prima di provare a recuperarlo.

StackOverflow sembra non codificarli:

https://stackoverflow.com/search?q=square+brackets+%5Burl%5D

I migliori per l’URL codificano quelli, in quanto chiaramente non sono supportati in tutti i server web. A volte, anche quando c’è uno standard, non tutti lo seguono.

In base alle specifiche dell’URL , le parentesi quadre non sono caratteri URL validi.

Ecco i frammenti pertinenti:

I caratteri “nazionale” e “punteggiatura” non compaiono in nessuna produzione e quindi potrebbero non apparire negli URL.
nazionale {| } | vline | [| ] | \ | ^ | ~
punteggiatura <| >

Le parentesi quadre [ e ] negli URL non sono spesso supportate.

Sostituiscili con %5B e %5D :

  • Utilizzando una riga di comando, il seguente esempio è basato su bash e sed :

     url='http://example.com?day=[0-3][0-9]' encoded_url="$( sed 's/\[/%5B/g;s/]/%5D/g' <<< "$url")" 
  • Utilizzo di Java URLEncoder.encode(String s, String enc)

  • Utilizzando PHP rawurlencode() o urlencode()

     '; ?> 

    produzione:

      

    o:

     '; ?> 
  • Usando il tuo linguaggio di programmazione preferito ... Per favore estendi questa risposta pubblicando un commento o modificando direttamente questa risposta per aggiungere la funzione che usi dal tuo linguaggio di programmazione 😉

Per maggiori dettagli, vedi RFC 3986 che specifica la syntax dell'URL. L' Appendice A è circa %-encoding nella stringa di query (parentesi come appartenenti a "gen-delim" per essere %-encoded ).

Le parentesi quadre sono considerate non sicure, ma la maggior parte dei browser le analizzerà correttamente. Detto questo, è meglio sostituire le parentesi quadre con altri caratteri.