Come verificare se una stringa è un URL valido

24 ott 2014, 19:43:37
Visualizzazioni: 33.9K
Voti: 15

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.

Rif: http://codex.wordpress.org/Function_Reference/is_email

0
Tutte le risposte alla domanda 7
5
12

Utilizza la funzione nativa di PHP Filtro Validatore

if (filter_var($url, FILTER_VALIDATE_URL) === FALSE) {
    die('URL non valido');
}
24 ott 2014 19:59:58
Commenti

Ottimo e grazie @shanebp - non sapevo esistesse quel filtro!

henrywright henrywright
24 ott 2014 20:01:20

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 tobltobs
6 ott 2015 19:13:41

@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']}").

dotancohen dotancohen
8 lug 2018 17:35:46

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.

thespacecamel thespacecamel
3 set 2018 20:51:27

Il tuo metodo valida ttps://www.youtube.com come valido. In altre parole - non usare FILTER_VALIDATE_URL - non è affidabile.

Jeffz Jeffz
17 mag 2020 16:40:23
4
10

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.

24 lug 2018 13:49:01
Commenti

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>.

thespacecamel thespacecamel
3 set 2018 20:57:52

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

thespacecamel thespacecamel
3 set 2018 21:05:27

@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'; }`

Ashish Shrestha Ashish Shrestha
4 set 2018 14:33:09

Tieni presente che può essere un po' lento, poiché utilizza gethostbyname() per ottenere l'IP dell'URL per effettuare ulteriori verifiche.

Lucas Bustamante Lucas Bustamante
19 gen 2020 23:50:31
0

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.

6 nov 2015 09:35:33
1

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.

  1. Se non sai se il sito utilizza il protocollo https o http, è meglio usare '//'.
  2. wp_http_validate_url è migliorato dagli sviluppatori di WP (è più specifico).
  3. 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/

Rif: https://www.php.net/manual/en/function.filter-var.php

5 feb 2020 11:49:12
Commenti

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

Aurovrata Aurovrata
30 set 2021 19:13:25
0

Discutiamo le opzioni per la validazione degli URL in WordPress, iniziando con quelle più ovvie.

  1. filter_var() con il filtro FILTER_VALIDATE_URL in PHP non funziona per i nomi di dominio internazionalizzati che contengono caratteri non ASCII come http://스타벅스코리아.com. Presenta anche altri problemi, come discusso da David Müller, ad esempio accetta http://example.com/"><script>alert("xss")</script> come URL valido anche se è chiaramente dannoso.

  2. 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.

  3. 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.

  4. 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;
    }
}
1 mag 2021 00:06:15
1

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/

3 set 2018 20:56:25
Commenti

questo valida solo la stringa di caratteri, non differenzia tra le stringhe my-domain e http://my-domain.com/?id=1 2 3, nel secondo caso il tuo esempio invaliderebbe un URL perfettamente valido.

Aurovrata Aurovrata
30 set 2021 17:19:56
0
-2

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.

24 ott 2014 20:08:05