WP_HTTP_VALIDATE_URL() – проверка безопасности URL в HTTP API WordPress

WP_HTTP_VALIDATE_URL() │ WP 3.5.2

Функция wp_http_validate_url() проверяет URL для безопасного использования в HTTP API WordPress. Это позволяет избежать потенциальных проблем с небезопасными ссылками.

Примеры небезопасных URL

Вот несколько примеров URL, которые считаются небезопасными:

  • ftp://example.com/caniload.php — Неверный протокол, разрешены только http и https.
  • http:///example.com/caniload.php — Неправильный формат URL.
  • http://user:pass@example.com/caniload.php — Содержит информацию для входа.
  • http://example.invalid/caniload.php — Неверное имя хоста, так как IP не может быть найден в DNS.

Примеры URL, которые считаются небезопасными по умолчанию

  • http://192.168.0.1/caniload.php — IP-адреса из локальной сети. Это можно изменить с помощью фильтра http_request_host_is_external.
  • http://198.143.164.252:81/caniload.php — По умолчанию разрешены только порты 80, 443 и 8080. Это можно изменить с помощью фильтра http_allowed_safe_ports.

Возвращаемое значение

Функция возвращает строку с валидным URL или false, если проверка не прошла.

$url(string) (обязательный) URL для запроса.

Примеры использования

Вот несколько примеров использования wp_http_validate_url() для проверки различных вариантов 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@example.com/cdn-cgi/l/email-protection/'); // 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

Альтернативный вариант проверки URL

Если вы проверяете URL, который был введен пользователем, лучше использовать функцию esc_url_raw(). Пример:

esc_url_raw( $url ) === $url

Список хуков, связанных с функцией

  • http_request_host_is_external — Позволяет изменить проверку на внешний запрос.
  • http_allowed_safe_ports — Позволяет изменить список разрешенных портов.

Код функции

Ниже приведен код функции wp_http_validate_url, который осуществляет проверки:

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 ) {
                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] )
            ) {
                if ( ! apply_filters( 'http_request_host_is_external', false, $host, $url ) ) {
                    return false;
                }
            }
        }
    }

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

    $port = $parsed_url['port'];
    $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;
}

Заключение

Функция wp_http_validate_url() помогает защитить ваш сайт WordPress от небезопасных ссылок. Используйте её для проверки URL перед выполнением запросов, чтобы гарантировать безопасность вашего приложения.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *