wp_http_validate_url() │ WP 3.5.2
Проверяет можно ли использовать указанный URL в HTTP запросе, например в HTTP API.
URL не пройдет проверку (вернется false), если:
В URL указан неверный протокол (отличный от http/https): см. функцию wp_kses_bad_protocol()
Не удалось разобрать переданный URL с помощью PHP функции parse_url() .
В имени домена присутствует символ: :#?[]
В URL указаны юзер или пароль (user/pass).
Домен в указанном URL отличается от текущего домена сайта (внешний URL) и при этом полученный IP внешнего домена, является внутренним (localhost). Разрешить внутренние URL можно через фильтр: http_request_host_is_external .
URL пройдет проверку (вернется указанный URL), если пройдены все вышеописанные проверки и:
В URL не указан никакой порт,
или порт указан и он равен, одному из: 80, 443, 8080,
или домен сайта равен домену URL и порт домена сайта совпадает с портом указанного URL.
1 раз — 0.003391 сек (очень медленно) | 50000 раз — 7.47 сек (быстро) | PHP 7.1.11, WP 4.9.5
Возвращает
Строку|false. Переданный URL или false если URL не прошел проверку.
Использование
$url = wp_http_validate_url( $url );
$url(строка) (обязательный)
URL который нужно проверить и очистить.
Примеры
#1 Демонстрация проверок разных вариантов URL
// внутренний URL
echo wp_http_validate_url('wp-kama.ru'); // false
echo wp_http_validate_url('https://wp-kama.ru'); // https://wp-kama.ru
// внешний URL
echo wp_http_validate_url('site.com'); // false
echo wp_http_validate_url('http://example.com'); // http://example.com
// URL с юзером и паролем
echo wp_http_validate_url('http://username:password@site.com/'); // false
// URL с портом
echo wp_http_validate_url('http://example.com:80/'); // http://example.com:80/
echo wp_http_validate_url('http://example.com:123/'); // false
Добавить свой пример
Список изменений
Код wp_http_validate_url() wp http validate url
WP 7.0.3
function wp_http_validate_url( $url ) {
if ( ! is_string( $url ) || '' === $url || is_numeric( $url ) ) {
return false;
}
$original_url = $url;
$url = wp_kses_bad_protocol( $url, array( 'http', 'https' ) );
if ( ! $url || strtolower( $url ) !== strtolower( $original_url ) ) {
return false;
}
$parsed_url = parse_url( $url );
if ( ! $parsed_url || empty( $parsed_url['host'] ) ) {
return false;
}
if ( isset( $parsed_url['user'] ) || isset( $parsed_url['pass'] ) ) {
return false;
}
if ( false !== strpbrk( $parsed_url['host'], ':#?[]' ) ) {
return false;
}
$parsed_home = parse_url( get_option( 'home' ) );
$same_host = isset( $parsed_home['host'] ) && strtolower( $parsed_home['host'] ) === strtolower( $parsed_url['host'] );
$host = trim( $parsed_url['host'], '.' );
if ( ! $same_host ) {
if ( preg_match( '#^(([1-9]?\d|1\d\d|25[0-5]|2[0-4]\d)\.){3}([1-9]?\d|1\d\d|25[0-5]|2[0-4]\d)$#', $host ) ) {
$ip = $host;
} else {
$ip = gethostbyname( $host );
if ( $ip === $host ) { // Error condition for gethostbyname().
return false;
}
}
if ( $ip ) {
$parts = array_map( 'intval', explode( '.', $ip ) );
/*
* These IP address ranges are not considered valid external hosts for HTTP requests.
*
* If the host resolves to an IP address in these ranges, the request will be rejected unless the 'http_request_host_is_external' filter allows it.
*
* References:
*
* - IPv4 Special-Purpose Address Space: https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml
* - IPv4 Multicast Address Assignments: https://www.rfc-editor.org/rfc/rfc5771.html
*/
if ( 127 === $parts[0] || 10 === $parts[0] || 0 === $parts[0] // 127.0.0.0/8 (loopback), 10.0.0.0/8 (private), 0.0.0.0/8 (this network).
|| ( 172 === $parts[0] && 16 <= $parts[1] && 31 >= $parts[1] ) // 172.16.0.0/12 (private).
|| ( 192 === $parts[0] && 168 === $parts[1] ) // 192.168.0.0/16 (private).
|| ( 192 === $parts[0] && 0 === $parts[1] && 0 === $parts[2] ) // 192.0.0.0/24 (IETF protocol assignments).
|| ( 192 === $parts[0] && 0 === $parts[1] && 2 === $parts[2] ) // 192.0.2.0/24 (TEST-NET-1).
|| ( 192 === $parts[0] && 88 === $parts[1] && 99 === $parts[2] ) // 192.88.99.0/24 (6to4 relay anycast).
|| ( 198 === $parts[0] && 51 === $parts[1] && 100 === $parts[2] ) // 198.51.100.0/24 (TEST-NET-2).
|| ( 203 === $parts[0] && 0 === $parts[1] && 113 === $parts[2] ) // 203.0.113.0/24 (TEST-NET-3).
|| ( 169 === $parts[0] && 254 === $parts[1] ) // 169.254.0.0/16 (link-local and cloud metadata).
|| ( 100 === $parts[0] && 64 <= $parts[1] && 127 >= $parts[1] ) // 100.64.0.0/10 (CGNAT).
|| ( 198 === $parts[0] && 18 <= $parts[1] && 19 >= $parts[1] ) // 198.18.0.0/15 (benchmarking).
|| ( 224 <= $parts[0] && 239 >= $parts[0] ) // 224.0.0.0/4 (multicast).
|| 240 <= $parts[0] // 240.0.0.0/4 (reserved, includes 255.255.255.255 broadcast).
) {
// If host appears local, reject unless specifically allowed.
/**
* Checks if HTTP request is external or not.
*
* Allows to change and allow external requests for the HTTP request.
*
* @since 3.6.0
*
* @param bool $external Whether HTTP request is external or not.
* @param string $host Host name of the requested URL.
* @param string $url Requested URL.
*/
if ( ! apply_filters( 'http_request_host_is_external', false, $host, $url ) ) {
return false;
}
}
}
}
if ( empty( $parsed_url['port'] ) ) {
return $url;
}
$port = $parsed_url['port'];
/**
* Controls the list of ports considered safe in HTTP API.
*
* Allows to change and allow external requests for the HTTP request.
*
* @since 5.9.0
*
* @param int[] $allowed_ports Array of integers for valid ports. Default allowed ports
* are 80, 443, and 8080.
* @param string $host Host name of the requested URL.
* @param string $url Requested URL.
*/
$allowed_ports = apply_filters( 'http_allowed_safe_ports', array( 80, 443, 8080 ), $host, $url );
if ( is_array( $allowed_ports ) && in_array( $port, $allowed_ports, true ) ) {
return $url;
}
if ( $parsed_home && $same_host && isset( $parsed_home['port'] ) && $parsed_home['port'] === $port ) {
return $url;
}
return false;
}
Cвязанные функции