So überprüfen Sie, ob eine Zeichenfolge eine gültige URL ist

7

WordPress bietet eine hilfreiche Funktion, is_email()die überprüft, ob eine bestimmte E-Mail-Adresse gültig ist. Gibt es eine ähnliche Funktion, um zu überprüfen, ob eine URL gültig ist?

Ich habe es versucht, is_url()aber das war nur Wunschdenken meinerseits.

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

Henrywright
quelle

Antworten:

9

Verwenden Sie die native PHP-Funktion Filter Validator

if (filter_var($url, FILTER_VALIDATE_URL) === FALSE) {
    die('Not a valid URL');
}
shanebp
quelle
Schön und danke @shanebp - wusste nie, dass es einen Filter gibt!
Henrywright
2
FILTER_VALIDATE_URL sieht gut aus, hat aber einige ernsthafte Probleme: d-mueller.de/blog/…
tobltobs
@tobltobs: Das sind keine Probleme, es sind Features. Der Autor beschwert sich darüber, dass gültige URLs als gültig gemeldet werden. Das ist wie sich zu beschweren, dass PDO kaputt ist, weil es erlaubt ist $pdo->query("SELECT pw FROM users WHERE id={$_GET['id']}").
Dotancohen
Sie haben vielleicht Recht @dotancohen, dass dies technisch gültige URLs sind. Vielleicht liegt das Problem wirklich in unserer Frage. Wir wollen nicht nur "technisch gültige URLs", sondern auch "sichere URLs". zB URLs, die helfen, XSS-Angriffe oder anderes Unheil zu verhindern. Der Vorschlag von @ orionrush vermeidet eine Reihe dieser Probleme, während FILTER_VALIDATE_URLdies nicht der Fall ist.
Thespacecamel
Ihr Weg gilt ttps://www.youtube.comals gültig. Mit anderen Worten - verwenden Sie nicht FILTER_VALIDATE_URL - es ist unzuverlässig.
Jeffz
6

Ich weiß, dass dies ein alter Beitrag ist, aber für jeden Besucher lohnt es sich auch, die WP-Funktionen zu berücksichtigen, esc_url()und esc_url_raw()letztere sind sicher für Datenbankeinträge usw., da sie keine Entitäten codieren. esc_url()codiert Entitäten und ist daher gut für die Anzeige für Benutzer.

In der Quelle können Sie sehen, dass esc_url()nach einer Whitelist zulässiger Protokolle und Strukturen FILTER_VALIDATE_URLgesucht wird, wodurch einige der Schwachstellen vermieden werden , die durch den von @tobltobs bereitgestellten Link festgestellt werden.

Orionrush
quelle
2

Ich fand es wp_http_validate_urlsehr praktisch, während der Arbeit an meinem Projekt zu überprüfen, ob eine Zeichenfolge eine gültige URL enthält oder nicht.

Nehmen Sie hier eine Referenz: https://developer.wordpress.org/reference/functions/wp_http_validate_url/

Zum Beispiel:

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

    // It's valid URL;

} else {

    // It's NOT valid URL;

}

Es gibt die URL selbst zurück, wenn sie gültig ist, andernfalls false.

Ashish Shrestha
quelle
Diese Funktion klingt großartig, aber ich denke, sie hat einige Fehler in Bezug auf vom Benutzer übermittelte Daten gemacht. Die URL wurde localhostals ungültig eingestuft. aber es hat sich http://example.com/"><script>alert("xss")</script>als gültig erwiesen.
Thespacecamel
Entschuldigung, SO darf ich meinen Kommentar nicht ändern. Ich meinte, es findet http://localhostungültig.
Thespacecamel
1
@thespacecamel Sie können http_request_host_is_externalFilter verwenden, um localhost zu erlauben: 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
Beachten Sie, dass es etwas langsam sein kann, da gethostbyname()die IP-Adresse der URL abgerufen wird, um weitere Aussagen zu treffen.
Lucas Bustamante
0

Ich schlage vor , um sicherzustellen, dass die vom Benutzer übermittelte URL gültig und sicher ist , um sie zu speichern und später anzuzeigen

esc_url_raw($url) === $url

esc_url_raw(), wie oben erwähnt, bereinigt @orionrush die URL, indem alles Ungültige oder Böswillige daraus entfernt wird. Wenn die Zeichenfolge nichts Ungültiges oder Bösartiges enthält, ist dies in Ordnung.

Z.B

if( esc_url_raw($url) === $url ) {
   // URL is valid. Use it...
} else {
   // URL is invalid or malicious. Don't use it...
}

Ich habe hier einen längeren Blog-Beitrag dazu geschrieben: https://cmljnelson.wordpress.com/2018/08/31/url-validation-in-wordpress/

Thespacecamel
quelle
0

Meiner Meinung nach ist es besser, wp_http_validate_url zu verwenden .

Beispiel 1:

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

Falsch zurückgeben.

Beispiel 2:

wp_http_validate_url( '//website.com' )

URL zurückgeben.

  1. Wenn Sie nicht wissen, ob die Website das https- oder das http-Protokoll verwendet, ist es besser, '//' zu verwenden.
  2. wp_http_validate_url wurde von WP-Entwicklern verbessert (genauer).
  3. Theoretisch können Sie einige Hooks (Filter & Aktionen) für wp_http_validate_url verwenden . Sie können keine Hooks für filter_var verwenden .

Ref: https://developer.wordpress.org/reference/functions/wp_http_validate_url/

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

Daniel
quelle
-2

is_email()Überprüfen Sie tatsächlich nicht, ob eine E-Mail-Adresse gültig ist, sondern nur, wenn sie den Spezifikationen entspricht. Die E-Mail, die ich gerne für viele Websites zur Verfügung stelle, die sinnloses Interesse an meiner E-Mail-Adresse zeigen, lautet [email protected]. Dies entspricht der Adresse, aber es ist unwahrscheinlich, dass jemand sie verwendet.

Das Auschecken von URLs erfolgt am besten durch Pingen. Sie können versuchen, die Konformität zu überprüfen, aber theoretisch gibt es kaum Einschränkungen, was eine codierte URL sein kann.

Mark Kaplun
quelle