Come verificare se una stringa è un URL valido
WordPress fornisce una funzione utile chiamata is_email()
che verifica se un indirizzo email fornito è valido. Esiste una funzione simile disponibile per verificare se un URL è valido?
Ho provato is_url()
ma era solo un mio desiderio illusorio.

Utilizza la funzione nativa di PHP Filtro Validatore
if (filter_var($url, FILTER_VALIDATE_URL) === FALSE) {
die('URL non valido');
}

FILTER_VALIDATE_URL sembra buono ma ha alcuni problemi seri: https://d-mueller.de/blog/why-url-validation-with-filter_var-might-not-be-a-good-idea/

@tobltobs: Questi non sono problemi, sono caratteristiche. L'autore si lamenta che URL validi vengano segnalati come validi. È come lamentarsi che PDO sia rotto perché permette $pdo->query("SELECT pw FROM users WHERE id={$_GET['id']}")
.

Potresti avere ragione @dotancohen, che quelli siano tecnicamente URL validi. Quindi forse il problema è davvero nella nostra domanda. Non vogliamo solo "URL tecnicamente validi", ma "URL sicuri". Ad esempio, URL che aiutano a prevenire attacchi XSS o altri problemi. Il suggerimento di @orionrush evita molti di questi problemi, mentre FILTER_VALIDA_URL
non lo fa.

Ho trovato wp_http_validate_url
molto utile per verificare se una stringa è un URL valido mentre lavoravo al mio progetto.
Puoi consultare la documentazione qui: https://developer.wordpress.org/reference/functions/wp_http_validate_url/
Ad esempio:
$val = 'http://somevalidurl.com';
if ( wp_http_validate_url( $val ) ) {
// È un URL valido;
} else {
// NON è un URL valido;
}
Restituisce l'URL stesso se è valido, altrimenti restituisce false.

Questa funzione sembra fantastica, ma penso che abbia commesso qualche errore riguardo ai dati inviati dagli utenti.
Ha considerato l'URL localhost
come non valido;
ma ha ritenuto valido http://example.com/"><script>alert("xss")</script>
.

scusa, SO non mi permette di modificare il mio commento. Intendevo che considera http://localhost
non valido.

@thespacecamel Puoi usare il filtro http_request_host_is_external
per permettere localhost:
`function allow_some_url( $external, $host, $url ) { return ( $host === 'localhost' ) ? true : $external;
} add_filter( 'http_request_host_is_external', 'allow_some_url', 10, 3 );
if ( wp_http_validate_url( 'http://localhost/wordpress/' ) ) { echo 'valido'; } else { echo 'non valido'; }`

So che questo è un vecchio post, ma per chiunque lo visiti vale anche la pena considerare le funzioni di WP esc_url()
e esc_url_raw()
, quest'ultima sicura per voci di database ecc., in quanto non codifica le entità. esc_url()
invece codifica le entità ed è quindi utile per la visualizzazione agli utenti.
Nel codice sorgente puoi vedere che esc_url()
verifica una whitelist di protocolli e strutture consentiti, evitando così alcune delle vulnerabilità di FILTER_VALIDATE_URL
segnalate dal link postato da @tobltobs.

Secondo me è meglio usare wp_http_validate_url.
Esempio 1:
filter_var( '//website.com', FILTER_VALIDATE_URL )
Restituisce false.
Esempio 2:
wp_http_validate_url( '//website.com' )
Restituisce l'URL.
- Se non sai se il sito utilizza il protocollo https o http, è meglio usare '//'.
- wp_http_validate_url è migliorato dagli sviluppatori di WP (è più specifico).
- Puoi migliorare o modificare wp_http_validate_url usando hook (filtri e azioni). Non puoi usare hook per filter_var.
Rif: https://developer.wordpress.org/reference/functions/wp_http_validate_url/

Sono d'accordo, wp_http_validate_url()
è un validatore migliore, che consente anche indirizzi IP e impone una validazione aggiuntiva per gli URL localhost con il filtro http_request_host_is_external
che per impostazione predefinita restituisce false come misura di sicurezza aggiuntiva

Discutiamo le opzioni per la validazione degli URL in WordPress, iniziando con quelle più ovvie.
filter_var()
con il filtroFILTER_VALIDATE_URL
in PHP non funziona per i nomi di dominio internazionalizzati che contengono caratteri non ASCII comehttp://스타벅스코리아.com
. Presenta anche altri problemi, come discusso da David Müller, ad esempio accettahttp://example.com/"><script>alert("xss")</script>
come URL valido anche se è chiaramente dannoso.wp_http_validate_url()
in WordPress potrebbe fare un lavoro migliore, anche se è stato pensato specificamente per l'uso nell'API HTTP e non per la validazione generale degli URL. Tuttavia, non risolve i due problemi specifici menzionati prima.preg_match()
in PHP potrebbe funzionare o meno. Scrivere espressioni regolari che prevedano ogni possibile scenario non è sempre la soluzione ideale e ottenere un risultato universalmente corretto potrebbe non essere possibile in alcuni casi.esc_url_raw()
in WordPress non è pensato per la validazione degli URL, ma sembra fare un lavoro migliore degli altri. Funziona con caratteri non ASCII e risolve anche gli altri problemi discussi in precedenza. Questa funzione sanifica qualsiasi stringa per il salvataggio nel database di WordPress come URL, rimuovendo o modificando i caratteri non validi o dannosi. Pertanto, se la versione sanificata non è uguale a quella originale, si può affermare con una certa sicurezza che l'URL non è valido e, soprattutto, non è sicuro.
Ecco come può essere eseguita la verifica dell'URL con la funzione esc_url_raw()
, sfruttando anche la funzione strtolower()
per rendere la verifica insensibile alle maiuscole/minuscole.
function validateUrl($url) {
if ( strtolower(esc_url_raw($url)) === strtolower($url) ) {
return $url;
} else {
return false;
}
}

Per verificare che un URL inviato dall'utente sia valido e sicuro da memorizzare e visualizzare successivamente, suggerisco
esc_url_raw($url) === $url
esc_url_raw()
, come menzionato da @orionrush sopra, sanifica l'URL rimuovendo qualsiasi elemento non valido o dannoso. Quindi, se la stringa non contiene nulla di non valido o dannoso, allora va bene.
Esempio
if( esc_url_raw($url) === $url ) {
// L'URL è valido. Usalo...
} else {
// L'URL non è valido o è dannoso. Non usarlo...
}
Ho scritto un articolo più dettagliato su questo argomento qui: https://cmljnelson.wordpress.com/2018/08/31/url-validation-in-wordpress/

is_email()
in realtà non verifica se un indirizzo email è valido, ma solo se è conforme alle specifiche. L'email che fornisco volentieri a molti siti che mostrano un interesse inutile per il mio indirizzo email è a@b.com, che è un indirizzo conforme ma è improbabile che qualcuno lo utilizzi realmente.
Il modo migliore per verificare gli URL è effettuare un ping. Puoi provare a controllare la conformità, ma in teoria ci sono pochissime limitazioni su cosa può essere un URL codificato.
