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 перед выполнением запросов, чтобы гарантировать безопасность вашего приложения.