Cum verifici dacă un șir de caractere este un URL valid

24 oct. 2014, 19:43:37
Vizualizări: 33.9K
Voturi: 15

WordPress oferă o funcție utilă numită is_email() care verifică dacă o adresă de email este validă. Există o funcție similară disponibilă pentru a verifica dacă un URL este valid?

Am încercat is_url() dar asta a fost doar o presupunere optimistă din partea mea.

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

0
Toate răspunsurile la întrebare 7
5
12

Folosește funcția nativă PHP Filtru Validator

if (filter_var($url, FILTER_VALIDATE_URL) === FALSE) {
    die('URL-ul nu este valid');
}
24 oct. 2014 19:59:58
Comentarii

Bună observație și mulțumesc @shanebp - nu știam că există acest filtru!

henrywright henrywright
24 oct. 2014 20:01:20

FILTER_VALIDATE_URL pare bun dar are câteva probleme serioase: https://d-mueller.de/blog/why-url-validation-with-filter_var-might-not-be-a-good-idea/

tobltobs tobltobs
6 oct. 2015 19:13:41

@tobltobs: Acelea nu sunt probleme, ci caracteristici. Autorul se plânge că URL-uri valide sunt raportate ca valide. E ca și cum te-ai plânge că PDO e stricat pentru că permite $pdo->query("SELECT pw FROM users WHERE id={$_GET['id']}").

dotancohen dotancohen
8 iul. 2018 17:35:46

Ai putea avea dreptate @dotancohen, că acelea sunt URL-uri valide din punct de vedere tehnic. Deci poate problema este într-adevăr în întrebarea noastră. Nu căutăm doar "URL-uri valide din punct de vedere tehnic", ci "URL-uri sigure". Adică, URL-uri care ajută la prevenirea atacurilor XSS sau altor probleme. Sugestia lui @orionrush evită o serie din aceste probleme, în timp ce FILTER_VALIDATE_URL nu o face.

thespacecamel thespacecamel
3 sept. 2018 20:51:27

Metoda ta validează ttps://www.youtube.com ca fiind validă. Cu alte cuvinte - nu utiliza FILTER_VALIDATE_URL - nu este de încredere.

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

Am găsit funcția wp_http_validate_url destul de utilă pentru a verifica dacă un șir de caractere este un URL valid sau nu în timp ce lucram la proiectul meu.

Consultați documentația oficială aici: https://developer.wordpress.org/reference/functions/wp_http_validate_url/

De exemplu:

$val = 'http://somevalidurl.com';
if ( wp_http_validate_url( $val ) ) {

    // Este un URL valid;

} else {

    // NU este un URL valid;

}

Funcția returnează URL-ul însuși dacă este valid, altfel returnează false.

24 iul. 2018 13:49:01
Comentarii

Această funcție pare grozavă, dar cred că a făcut câteva greșeli în legătură cu datele introduse de utilizatori. A considerat URL-ul localhost ca fiind invalid; dar a considerat http://example.com/"><script>alert("xss")</script> ca fiind valid.

thespacecamel thespacecamel
3 sept. 2018 20:57:52

scuze, SO nu mă lasă să modific comentariul. Voiam să spun că consideră http://localhost invalid.

thespacecamel thespacecamel
3 sept. 2018 21:05:27

@thespacecamel Poți folosi filtrul http_request_host_is_external pentru a permite 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 'valid'; } else { echo 'invalid'; }`

Ashish Shrestha Ashish Shrestha
4 sept. 2018 14:33:09

Ține minte că poate fi un pic lent, deoarece utilizează gethostbyname() pentru a obține adresa IP a URL-ului pentru a face alte verificări.

Lucas Bustamante Lucas Bustamante
19 ian. 2020 23:50:31
0

Știu că acesta este un articol vechi, dar pentru oricine îl vizitează, merită luate în considerare și funcțiile WP esc_url() și esc_url_raw(), cea din urmă fiind sigură pentru intrările în baze de date etc., deoarece nu codifică entități. esc_url() codifică entități și, prin urmare, este bună pentru afișare utilizatorilor.

În sursă puteți vedea că esc_url() verifică o listă albă de protocoale și structuri permise și, astfel, evită unele dintre vulnerabilitățile FILTER_VALIDATE_URL menționate de linkul postat de @tobltobs.

6 nov. 2015 09:35:33
1

În opinia mea, este mai bine să folosești wp_http_validate_url.

Exemplul 1:

filter_var( '//website.com', FILTER_VALIDATE_URL )

Returnează false.

Exemplul 2:

wp_http_validate_url( '//website.com' )

Returnează URL-ul.

  1. Dacă nu știi dacă site-ul folosește protocolul https sau http, este mai bine să folosești '//'.
  2. wp_http_validate_url este îmbunătățit de dezvoltatorii WordPress (este mai specific).
  3. Poți îmbunătăți sau modifica wp_http_validate_url folosind hook-uri (filtre & acțiuni). Nu poți folosi hook-uri pentru filter_var.

Referință: https://developer.wordpress.org/reference/functions/wp_http_validate_url/

Referință: https://www.php.net/manual/en/function.filter-var.php

5 feb. 2020 11:49:12
Comentarii

Sunt de acord, wp_http_validate_url() este un validator mai bun, permițând atât adrese IP, cât și forțând o validare suplimentară pentru URL-uri localhost cu filtru http_request_host_is_external care implicit returnează false ca măsură de siguranță suplimentară

Aurovrata Aurovrata
30 sept. 2021 19:13:25
0

Să discutăm opțiunile noastre pentru validarea URL-urilor în WordPress, începând cu cele evidente.

  1. filter_var() cu filtrul FILTER_VALIDATE_URL în PHP nu funcționează pentru nume de domenii internaționale care conțin caractere non-ASCII, cum ar fi http://스타벅스코리아.com. De asemenea, prezintă și alte probleme, așa cum a discutat David Müller, cum ar fi acceptarea http://example.com/"><script>alert("xss")</script> ca URL valid, chiar dacă este clar malefic.

  2. wp_http_validate_url() în WordPress poate face o treabă mai bună, deși a fost concepută special pentru utilizarea în API-ul HTTP și nu pentru validarea generală a URL-urilor. Dar tot nu rezolvă cele două probleme specifice discutate mai devreme.

  3. preg_match() în PHP poate funcționa sau nu. Scrierea expresiilor regulate care să anticipeze fiecare scenariu posibil nu este întotdeauna cea mai ideală soluție, iar obținerea unui rezultat universal corect poate fi uneori imposibilă.

  4. esc_url_raw() în WordPress nu este destinat validării URL-urilor, dar pare să facă o treabă mai bună decât celelalte. Va funcționa pentru caractere non-ASCII, precum și pentru rezolvarea celorlalte probleme discutate anterior. Această funcție va practic sanitiza orice șir de caractere pentru a fi salvat în baza de date WordPress ca un URL, eliminând sau modificând orice caractere care sunt fie invalide, fie malefice. Prin urmare, dacă versiunea sanitizată nu este aceeași cu cea nesanitizată, se poate spune cu încredere că URL-ul nu este valid și, cel mai important, nu este sigur.

Iată cum poate fi făcută verificarea URL-ului cu funcția esc_url_raw(), profitând și de funcția strtolower() pentru a face verificarea insensibilă la majuscule/minuscule.

function validateUrl($url) {
    if ( strtolower(esc_url_raw($url)) === strtolower($url) ) {
        return $url;
    } else {
        return false;
    }
}
1 mai 2021 00:06:15
1

Pentru a verifica dacă un URL introdus de utilizator este valid și sigur pentru stocare și afișare ulterioară, sugerez:

esc_url_raw($url) === $url

esc_url_raw(), așa cum a menționat @orionrush mai sus, sanitizează URL-ul prin eliminarea oricăror elemente invalide sau malicioase. Deci, dacă șirul de caractere nu conține nimic invalid sau rău intenționat, atunci este în regulă.

Exemplu:

if( esc_url_raw($url) === $url ) {
   // URL-ul este valid. Folosește-l...
} else {
   // URL-ul este invalid sau malicios. Nu-l utiliza...
}

Am scris un articol mai detaliat pe această temă aici: https://cmljnelson.wordpress.com/2018/08/31/url-validation-in-wordpress/

3 sept. 2018 20:56:25
Comentarii

acest lucru validează doar șirul de caractere, nu face diferența între șirurile my-domain și http://my-domain.com/?id=1 2 3, în ultimul caz exemplul tău ar invalida un URL perfect valid.

Aurovrata Aurovrata
30 sept. 2021 17:19:56
0
-2

is_email(), de fapt nu verifică dacă o adresă de email este validă, ci doar dacă respectă specificațiile standard. Adresa de email pe care o ofer cu plăcere pe multe site-uri care arată un interes inutil pentru adresa mea de email este a@b.com - aceasta respectă specificațiile, dar este puțin probabil să fie folosită de cineva.

Cel mai bun mod de a verifica URL-urile este prin trimiterea unei cereri ping. Puteți încerca să verificați conformitatea, dar teoretic există foarte puține limitări în ceea ce poate fi un URL codat.

24 oct. 2014 20:08:05