2048 || preg_match('/[\x00-\x20\x7f\\\\?#]/', $value) || preg_match('/%(?![0-9a-f]{2})/i', $value) || preg_match('/%(?:2e|2f|5c|25)/i', $value) || preg_match('#/(?:\.{1,2})(?:/|$)#', $value)) { return false; } $parts = wp_parse_url($value); if (!is_array($parts) || !isset($parts['scheme'], $parts['host'], $parts['path']) || 'https' !== strtolower($parts['scheme']) || (isset($parts['port']) && 443 !== $parts['port']) || isset($parts['user']) || isset($parts['pass']) || isset($parts['query']) || isset($parts['fragment'])) { return false; } $host = strtolower($parts['host']); $path = $parts['path']; if ('' === $host || '.' === substr($host, -1) || 'localhost' === $host || '.localhost' === substr($host, -10) || false !== filter_var($host, FILTER_VALIDATE_IP) || !preg_match('/^(?=.{1,253}$)(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/D', $host) || !is_string($path) || false !== strpos($path, '//') || substr($path, -strlen(self::SUFFIX)) !== self::SUFFIX || '/' === substr(substr($path, 0, -strlen(self::SUFFIX)), -1)) { return false; } return 'https://' . $host . $path; } public static function same_target($left, $right) { $a = self::canonical($left); $b = self::canonical($right); return is_string($a) && is_string($b) && hash_equals($a, $b); } public static function is_canonical($value) { $canonical = self::canonical($value); return is_string($value) && is_string($canonical) && hash_equals($value, $canonical); } }