WordPress как на ладони
Шаблоны, плагины и темы для настоящих поклонников Elementor. От TemplateMonster.com wordpress jino

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.
Работает на основе: wp_kses_bad_protocol()
✈ 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://site.com'); // http://site.com

// URL с юзером и паролем
echo wp_http_validate_url('http://username:password@site.com/'); // false

// URL с портом
echo wp_http_validate_url('http://site.com:80/'); // http://site.com:80/
echo wp_http_validate_url('http://site.com:123/'); // false

Код wp_http_validate_url: wp-includes/http.php VER 4.9.8

<?php
function wp_http_validate_url( $url ) {
	$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' ) );

	if ( isset( $parsed_home['host'] ) ) {
		$same_host = strtolower( $parsed_home['host'] ) === strtolower( $parsed_url['host'] );
	} else {
		$same_host = false;
	}

	if ( ! $same_host ) {
		$host = trim( $parsed_url['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()
				$ip = false;
		}
		if ( $ip ) {
			$parts = array_map( 'intval', explode( '.', $ip ) );
			if ( 127 === $parts[0] || 10 === $parts[0] || 0 === $parts[0]
				|| ( 172 === $parts[0] && 16 <= $parts[1] && 31 >= $parts[1] )
				|| ( 192 === $parts[0] && 168 === $parts[1] )
			) {
				// If host appears local, reject unless specifically allowed.
				/**
				 * Check if HTTP request is external or not.
				 *
				 * Allows to change and allow external requests for the HTTP request.
				 *
				 * @since 3.6.0
				 *
				 * @param bool   false Whether HTTP request is external or not.
				 * @param string $host IP of the requested host.
				 * @param string $url  URL of the requested host.
				 */
				if ( ! apply_filters( 'http_request_host_is_external', false, $host, $url ) )
					return false;
			}
		}
	}

	if ( empty( $parsed_url['port'] ) )
		return $url;

	$port = $parsed_url['port'];
	if ( 80 === $port || 443 === $port || 8080 === $port )
		return $url;

	if ( $parsed_home && $same_host && isset( $parsed_home['port'] ) && $parsed_home['port'] === $port )
		return $url;

	return false;
}

Cвязанные функции

Из метки: validate (проверка)

Еще из метки: HTTP API (curl remote)

Еще из раздела: Защита

Комментариев нет
    Здравствуйте, !     Войти . Зарегистрироваться