Perché "http: // dd" è un URL valido?
Domanda
Sto scrivendo un'app .NET 3.5 e sto usando URI.IsWellFormedUriString (string uriString, UriKind uriKind)
per verificare gli URI immessi dall'utente; utilizzando UriKind.Absolute
. Stavo solo giocando con l'applicazione e sono un po 'preoccupato e confuso sul perché qualcosa del tipo:
è un URI valido? Cosa dà? So che è perché fa parte della RFC, ma perché è valido in primo luogo?
L'unica volta che ho visto URI come quello è per Intranet aziendali, interne come
o
http: // localhost (che è molto popolare, ma anche un caso speciale)
Non voglio usare la mia espressione regolare poiché ci sono così tante regex URI diverse. Tuttavia, non voglio davvero che gli utenti entrino in URI in quel modo che non siano accessibili pubblicamente.
Qualche idea o pensiero? Grazie.
Soluzione
Questo perché è un URI perfettamente valido, come dici tu.
Modificherei leggermente la tua strategia ... Se desideri URI non solo validi (come in formato corretto), ma anche validi, nel senso che in realtà puntano a un sito, dovrai aggiungi un altro passaggio.
Dopo la convalida della stringa, emettere una richiesta HEAD per eseguire il ping dell'URL. Se restituisce un codice di stato 2xy, probabilmente sei a posto. Funzionerà nella maggior parte delle situazioni, ma non è privo di avvertimenti ed eccezioni.
Altri suggerimenti
è valido perché punta a una risorsa unica. In questo caso, punta al server web (si spera) del computer "ddd" sulla rete locale.
L'URI è un identificatore di risorsa univoco, non un identificatore di risorsa Web univoco. file: ///blah.txt è anche un URI valido
Perché è conforme a RFC 2396 ).
La RFC tiene conto di percorsi di risorse specifici costituiti solo da uno schema e da un elemento specifico dello schema, in questo caso un nome host. Finché identifica una risorsa unica e si conforma alla sintassi degli URI è valida.
Hai risposto tu stesso alla domanda. È un " valido " (ben formato) URI dalla definizione della specifica RFC ipso facto.
Per aiutare a risolvere il tuo compito richiesto, esegui alcuni controlli addizionali nella tua regex per uno o più punti (non dimenticare di sfuggirli!) o eventualmente prova a colpire la risorsa stessa per vedere se effettivamente risponde.
È un URI valido perché segue la sintassi degli URI: ha uno schema e un componente specifico dello schema ('http' è lo schema ',': 'separando i due, e' // ddd 'è la parte specifica del regime.)
Nel caso di un URI HTTP, segue anche la sintassi per quelli, con 'ddd' che è un nome host valido.
La sintassi degli URI è definita in http://www.ietf.org/rfc/ rfc2396.txt
Ecco un semplice esperimento per capire perché questo URL è valido:
0) utilizza l'utilità dig
o ping
per ottenere l'indirizzo IP di google.com. Ho ottenuto: 74.125.53.100
1) Modifica il tuo file / etc / hosts (su Windows è qualcosa come C: \ Windows \ system32 \ drivers \ etc \ hosts, e potresti aver bisogno di crearlo). Nel file hosts, aggiungi una riga come questa:
74.125.53.100 ddd
Non dimenticare di salvare le modifiche.
2) In un browser Web, vai a questo URL: http: // ddd
3) Hai appena effettuato l'accesso a Google utilizzando l'URL. Ecco perché è un URL valido.