I due punti `:` sono sicuri per l'uso di URL amichevoli?


109

Stiamo progettando un sistema URL che specificherà le sezioni dell'applicazione come parole separate da barre. In particolare, questo è in GWT, quindi le parti rilevanti dell'URL saranno nell'hash (che sarà interpretato da un livello del controller sul lato client):

http://site/gwturl#section1/section2

Alcune sezioni potrebbero richiedere attributi aggiuntivi, che vorremmo specificare con un :, in modo che le parti della sezione dell'URL non siano ambigue. Il codice si dividerebbe prima su /, poi su :, in questo modo:

http://site/gwturl#user:45/comments

Ovviamente, lo stiamo facendo per compatibilità con l'URL, quindi vorremmo assicurarci che nessuno di questi caratteri che avrà un significato speciale venga codificato dall'URL dai browser o da qualsiasi altro sistema e finisca con un URL come Questo:

http://site/gwturl#user%3A45/comments <--- BAD

Usare i due punti in questo modo è sicuro (con questo intendo che non verrà codificato automaticamente) per browser, sistemi di bookmarking, anche codice Javascript o Java?


Forse è una buona idea specificare (più chiaramente) che utilizzi gli URL solo sul lato client? Poiché molte delle risposte (come la mia) sembrano presumere che invierai l'URL a un server usando HTTP.
Veger

Modificato per aggiungere chiarimenti sul fatto che l'uso del frammento sta avvenendo sul lato client.
Nicole

Sono curioso: dopo 10 mesi, questo schema di URL ha funzionato per te? Sto pensando di utilizzare lo stesso schema.
Jonathan Swinney

1
@ Jonathan Swinney, Sfortunatamente sono passato da questo progetto (e compagnia), anche se le risposte qui mi hanno soddisfatto che sia la strada da percorrere. Se dovessi iniziare un nuovo progetto, utilizzerei questo schema, ma mi assicurerei anche di utilizzare #!per indicare che le pagine sono stateful - vedi googlewebmastercentral.blogspot.com/2009/10/… (Questa proposta è stata rispettata da utenti pesanti di AJAX come Facebook)
Nicole

Ho appena scoperto che WhatsApp taglierà un URL sui primi due punti, quindi ad esempio ha reso inutile un URL di Google Maps. Quindi sì, è importante sfuggirgli.
Petruza

Risposte:


84

Di recente ho scritto un codificatore di URL, quindi questo è abbastanza fresco nella mia mente.

http://site/gwturl#user:45/comments

Tutti i caratteri nella parte frammento ( user:45/comments) sono perfettamente legali per gli URI RFC 3986 .

Le parti rilevanti dell'ABNF :

fragment      = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
                 / "*" / "+" / "," / ";" / "="

A parte queste limitazioni, la parte del frammento non ha una struttura definita oltre a quella fornita dall'applicazione. Lo schema, http, dice solo che non invii questa parte al server.


MODIFICARE:

D'oh!

Nonostante le mie affermazioni sulla specifica URI, irreputable fornisce la risposta corretta quando fa notare che la specifica HTML 4 limita i nomi / identificatori degli elementi .

Tieni presente che le regole degli identificatori stanno cambiando in HTML 5 . Le restrizioni URI verranno comunque applicate (al momento della scrittura, ci sono alcuni problemi irrisolti sull'uso degli URI da parte di HTML 5).


Penso che tu stia facendo qualcosa, puoi spiegarlo un po 'di più? Non inviarlo al server non è un problema, poiché stiamo utilizzando GWT. Solo non sono sicuro di essere chiaro sulla sintassi specificata dalla sezione che hai citato.
Nicole

Ma :è un gen-delim, non un sub-delim.
bobince

1
Il punto e virgola è legale per un pchar, quindi se è in sub-delim o gen-delim non è un problema
Veger

@bobince - :è in pchar, che è in fragment, quindi :è consentito. @Renesis - Wikipedia ha un articolo su ABNF en.wikipedia.org/wiki/ABNF In pratica stai guardando un elenco di caratteri consentiti, dove /significa OR . Non ho fatto alcuna programmazione GWT, quindi non so come usi la parte frammentata degli URI.
McDowell

Un'ultima domanda: hai qualche idea dell'applicazione nel mondo reale di questa specifica? Questo significa che i browser dovrebbero / ignoreranno (salterà la codifica di) :nel frammento?
Nicole

59

Oltre all'analisi di McDowell sullo standard URI, ricorda anche che il frammento deve essere un nome di ancoraggio HTML valido. Secondo http://www.w3.org/TR/html4/types.html#type-name

I token ID e NAME devono iniziare con una lettera ([A-Za-z]) e possono essere seguiti da qualsiasi numero di lettere, cifre ([0-9]), trattini ("-"), trattini bassi ("_") , due punti (":") e punti (".").

Quindi sei fortunato. ":" è esplicitamente consentito. E nessuno dovrebbe "%" - sfuggirgli, non solo perché "%" è illegale lì, ma anche perché il frammento deve corrispondere al nome dell'ancora ogni carattere, quindi nessun agente dovrebbe tentare di manometterli in alcun modo.

Tuttavia devi provarlo. Gli standard Web non vengono seguiti rigorosamente, a volte gli standard sono in conflitto. Ad esempio, HTTP / 1.1 RFC 2616 non consente la stringa di query nell'URL della richiesta, mentre HTML ne costruisce una quando si invia un modulo con il metodo GET. Qualunque sia implementato nel mondo reale vince alla fine della giornata.


58

MediaWiki e altri motori wiki usano i due punti nei loro URL per designare gli spazi dei nomi, apparentemente senza grossi problemi.

ad es. http://en.wikipedia.org/wiki/Template:Welcome


31
Risposta più pertinente. Sappiamo tutti che ciò che è contenuto nelle specifiche ha poco a che fare con la realtà nello sviluppo web. Non avrai una garanzia di "sicurezza" molto migliore di "uno dei 10 migliori siti web al mondo lo fa".
Steven Collins

1
@StevenCollins Non più rilevante della risposta data 3 anni prima di questa che afferma esattamente la stessa cosa :)
Martin James

7

Non ci conterei. Probabilmente otterrà l'URL codificato come %3Ada molti user-agent.


1
@arbales: Sì. Alcuni user-agent meno conformi lasceranno privi di ornamenti gli URL non conformi.
Asaph

4

Da URLEncoderjavadoc:

Per ulteriori informazioni sulla codifica dei moduli HTML, consultare la specifica HTML .

Quando si codifica una stringa, si applicano le seguenti regole:

  • I caratteri alfanumerici da "a" a "z", da "A" a "Z" e da "0" a "9" rimangono gli stessi.
  • I caratteri speciali ".", "-", "*" e "_" rimangono gli stessi.
  • Il carattere spazio "" viene convertito in un segno più "+".
  • Tutti gli altri caratteri non sono sicuri e vengono prima convertiti in uno o più byte utilizzando uno schema di codifica. Quindi ogni byte è rappresentato dalla stringa di 3 caratteri "% xy", dove xy è la rappresentazione esadecimale a due cifre del byte. Lo schema di codifica consigliato da utilizzare è UTF-8. Tuttavia, per motivi di compatibilità, se non viene specificata una codifica, viene utilizzata la codifica predefinita della piattaforma.

Cioè, :non è sicuro.


3

Non vedo Firefox o IE8 che codificano alcuni degli URL di Wikipedia che includono il carattere.


1
Opera mantiene anche il punto e virgola, ma contare su un comportamento del genere non è una buona cosa da fare
Veger

1
Renesis sta parlando del frammento di URL e non del percorso dell'URL.
Gumbo

Wikipedia è stato uno dei miei pensieri quando ho scritto questa domanda. L'uso dei due punti è quindi tecnicamente non valido / pericoloso? Di solito vedo (e) in Wikipedia URL codificati, ma mai i due punti, il che mi ha lasciato un po 'confuso.
Nicole

3
The Wayback Machine ha un: in molti dei suoi collegamenti - ad esempio web.archive.org/web/20080822150704/http://stackoverflow.com
barrowc

2

I due punti vengono utilizzati come divisione tra nome utente e password se un protocollo richiede l'autenticazione.


0

Colon non è al sicuro. Vedere qui


Quella pagina non motiva il motivo per cui non sono al sicuro. L' RFC2396 a cui si fa riferimento non dice nemmeno che dovrebbe essere evitato. Inoltre, lo script di conversione fornito non lo codifica (in Chrome 9 comunque).
Adam Lindberg

Adam, ti sei sbagliato. Indica direttamente cosa e perché.
ktamlyn

-5

Non è un carattere sicuro e viene utilizzato per distinguere la porta a cui ti connetti quando si trova subito dopo il tuo nome di dominio

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.