isSameDomain
Paquete: @tiendana/utils
Verifica si dos URLs pertenecen al mismo dominio (host), útil para prevenir ataques de open redirect y validar orígenes de URLs.
Características
✅ Compara dominios de dos URLs
✅ Incluye puerto en la comparación
✅ Manejo seguro de errores
✅ Retorna false si URLs inválidas
✅ Usa API nativa URL
Firma
function isSameDomain(url1: string, url2: string): boolean
Parámetros
| Parámetro | Tipo | Descripción | Requerido |
|---|---|---|---|
url1 | string | Primera URL a comparar | ✅ |
url2 | string | Segunda URL a comparar | ✅ |
Retorno
Tipo: boolean
truesi ambas URLs tienen el mismo host (dominio + puerto)falsesi los hosts son diferentes o si alguna URL es inválida
Ejemplos de Uso
Comparación Básica
import { isSameDomain } from '@tiendana/utils';
isSameDomain('https://example.com/page1', 'https://example.com/page2');
// true
isSameDomain('https://example.com', 'https://other.com');
// false
Safe Redirect
function safeRedirect(targetUrl: string) {
const currentUrl = window.location.href;
if (isSameDomain(currentUrl, targetUrl)) {
window.location.href = targetUrl;
} else {
alert('No se permite redirección a otro dominio');
}
}
safeRedirect('https://example.com/dashboard'); // ✅ Permite
safeRedirect('https://malicious.com/phishing'); // ❌ Bloquea
Validar Links Externos
function isExternalLink(href: string): boolean {
return !isSameDomain(window.location.href, href);
}
// Agregar target="_blank" a links externos
document.querySelectorAll('a').forEach(link => {
if (isExternalLink(link.href)) {
link.setAttribute('target', '_blank');
link.setAttribute('rel', 'noopener noreferrer');
}
});
API Request Validation
function validateApiUrl(apiUrl: string): boolean {
const allowedDomains = [
'https://api.example.com',
'https://api-staging.example.com'
];
return allowedDomains.some(domain => isSameDomain(apiUrl, domain));
}
if (validateApiUrl(requestUrl)) {
fetch(requestUrl);
} else {
console.error('Dominio de API no permitido');
}
Casos de Uso Comunes
- Prevenir open redirects: Validar redirects de usuario
- Links externos: Detectar y marcar links a otros dominios
- CORS validation: Verificar origen de requests
- Security headers: Validar referrer/origin
- Navigation guards: Controlar navegación entre dominios
Comportamiento
Subdominios
isSameDomain('https://example.com', 'https://sub.example.com');
// false (diferentes hosts)
isSameDomain('https://www.example.com', 'https://example.com');
// false (www es subdominio diferente)
Puertos
isSameDomain('https://example.com:443', 'https://example.com');
// true (443 es el puerto por defecto de https y `URL.host` lo omite)
isSameDomain('https://example.com:8080', 'https://example.com');
// false (diferentes puertos)
isSameDomain('http://localhost:3000', 'http://localhost:4000');
// false (diferentes puertos)
Protocolos
isSameDomain('http://example.com', 'https://example.com');
// true (⚠️ mismo host, diferente protocolo)
URLs Inválidas
isSameDomain('invalid-url', 'https://example.com');
// false
isSameDomain('', 'https://example.com');
// false
Ver También
- parseJwt - Decodificar JWT tokens
- sanitizeEmail - Sanitizar emails