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 який потрібно перевірити та очистити.

Приклади

0

#1 Демонстрація перевірок різних варіантів URL

// внутрішній URL
echo wp_http_validate_url('wp-kama.ru'); // false
echo wp_http_validate_url('https://wp-doc.com'); // https://wp-doc.com

// зовнішній 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:[email protected]/'); // 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

список змін

З версії 3.5.2Введено.

Код wp_http_validate_url() WP 6.0.2

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|1dd|25[0-5]|2[0-4]d).){3}([1- 9]?d|1dd|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 ) );
			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] )
			) {
				// Якщо ви побачите місцевий, реject unless specifically allowed.
				/**
				 * Check if HTTP request is external or not.
				 *
				 * Дозволяє змінювати і дозволити зовнішніх запитів для HTTP запитів.
				 *
				 * @ 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 List of Ports є надійним в HTTP API.
	 *
	 * Дозволяє змінювати і дозволити зовнішніх запитів для HTTP запитів.
	 *
	 * @ Since 5.9.0
	 *
	 * @param array $allowed_ports Array of integers for valid ports.
	 * @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;
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *