Guía Completa de Análisis y Codificación URL: De la Estructura al Tratamiento Seguro
Codificación
Estructura Completa de URL
https://user:pass@example.com:8080/path/to/page?name=value&age=25#section
│ │ │ │ │ │ │ │ │
scheme user pass host port path query fragment
| Componente | Ejemplo | Descripción |
|---|---|---|
| scheme | https |
Protocolo |
| userinfo | user:pass |
Información de autenticación (raramente usado) |
| host | example.com |
Dominio o IP |
| port | 8080 |
Número de puerto (por defecto 80/443) |
| path | /path/to/page |
Ruta |
| query | ?name=value&age=25 |
Parámetros de consulta |
| fragment | #section |
Ancla (no se envía al servidor) |
Análisis con la API URL
Análisis básico
const url = new URL('https://example.com:8080/path?q=test#section');
url.protocol // "https:"
url.hostname // "example.com"
url.port // "8080"
url.pathname // "/path"
url.search // "?q=test"
url.hash // "#section"
url.origin // "https://example.com:8080"
url.href // URL completa
Análisis de parámetros de consulta
const url = new URL('https://example.com/api?name=Alice&age=25&tags=js&tags=css');
// URLSearchParams
url.searchParams.get('name') // "Alice"
url.searchParams.get('age') // "25"
url.searchParams.getAll('tags') // ["js", "css"]
url.searchParams.has('name') // true
url.searchParams.delete('age')
// Iterar
for (const [key, value] of url.searchParams) {
console.log(`${key} = ${value}`);
}
Modificar URL
const url = new URL('https://example.com/page');
url.pathname = '/new-page';
url.searchParams.set('sort', 'desc');
url.searchParams.append('filter', 'active');
url.hash = '#top';
console.log(url.toString());
// "https://example.com/new-page?sort=desc&filter=active#top"
Reglas de Codificación URL
¿Por qué es necesaria la codificación?
Las URLs solo permiten caracteres ASCII, otros caracteres deben codificarse:
Original: https://example.com/search?q=你好 世界
Codificado: https://example.com/search?q=%E4%BD%A0%E5%A5%BD%20%E4%B8%96%E7%95%8C
encodeURI vs encodeURIComponent
| Función | Alcance de codificación | Uso |
|---|---|---|
encodeURI |
Conserva caracteres estructurales de URL (:/?#[]@!$&'()*+,;=) |
Codificar URL completa |
encodeURIComponent |
Codifica todos los caracteres no ASCII + caracteres reservados | Codificar valores de parámetros de consulta |
const url = 'https://example.com/path?name=你好&redirect=/home';
// encodeURI: conserva la estructura de URL
encodeURI(url);
// "https://example.com/path?name=%E4%BD%A0%E5%A5%BD&redirect=/home"
// encodeURIComponent: codifica todos los caracteres especiales
encodeURIComponent(url);
// "https%3A%2F%2Fexample.com%2Fpath%3Fname%3D%E4%BD%A0%E5%A5%BD%26redirect%3D%2Fhome"
// ✅ Uso correcto: valores de parámetros con encodeURIComponent
const name = '你好 世界';
const redirect = '/home';
const fullUrl = `https://example.com/path?name=${encodeURIComponent(name)}&redirect=${encodeURIComponent(redirect)}`;
Tabla de codificación común
| Carácter | Codificación | Descripción |
|---|---|---|
| Espacio | %20 |
No usar + en URL |
+ |
%2B |
En parámetros de consulta + se decodifica como espacio |
& |
%26 |
Separador de parámetros de consulta |
= |
%3D |
Separador clave-valor |
# |
%23 |
Identificador de ancla |
% |
%25 |
Prefijo de codificación en sí |
| Chino | %E4%BD%A0 |
Codificación UTF-8 de tres bytes |
Usar ToolsKu para Codificar/Decodificar URL
- Abre la herramienta de Codificación/Decodificación URL
- Pega la URL o texto en el campo de entrada
- Haz clic en "Codificar" o "Decodificar"
- Consulta el resultado
Tratamiento Seguro de URL
1. Prevenir inyección de URL
// ❌ Peligroso: concatenar directamente la entrada del usuario
const url = `/api/users/${userId}`;
// ✅ Seguro: validar + codificar
function buildUserUrl(userId) {
if (!/^\d+$/.test(userId)) {
throw new Error('Invalid user ID');
}
return `/api/users/${encodeURIComponent(userId)}`;
}
2. Prevenir redirección abierta
// ❌ Peligroso: el usuario puede especificar cualquier URL de redirección
app.get('/login', (req, res) => {
res.redirect(req.query.redirect);
});
// ✅ Seguro: validación con lista blanca
function safeRedirect(url, allowedHosts) {
try {
const parsed = new URL(url, 'https://example.com');
if (allowedHosts.includes(parsed.hostname)) {
return url;
}
} catch {
// URL inválida
}
return '/'; // Redirigir a la página de inicio
}
3. Prevenir XSS vía URL
// ❌ Peligroso: protocolo javascript:
const url = 'javascript:alert(document.cookie)';
// ✅ Seguro: solo permitir protocolos http/https
function sanitizeUrl(url) {
try {
const parsed = new URL(url);
if (['http:', 'https:'].includes(parsed.protocol)) {
return url;
}
} catch {
// URL inválida
}
return 'about:blank';
}
API URLPattern (Nuevo Estándar)
// Coincidencia de rutas
const pattern = new URLPattern({ pathname: '/api/users/:id' });
const result = pattern.exec('https://example.com/api/users/123');
if (result) {
console.log(result.pathname.groups.id); // "123"
}
// Patrón más complejo
const apiPattern = new URLPattern({
protocol: 'https',
hostname: ':env.example.com',
pathname: '/api/:version/:resource/:id?',
});
const match = apiPattern.exec('https://prod.example.com/api/v2/users/456');
match.hostname.groups.env // "prod"
match.pathname.groups.version // "v2"
match.pathname.groups.resource // "users"
match.pathname.groups.id // "456"
Mejores Prácticas para Construir Parámetros de Consulta
Usar URLSearchParams
// ✅ Recomendado: usar URLSearchParams
const params = new URLSearchParams({
q: '搜索关键词',
sort: 'desc',
page: '1',
limit: '20',
});
params.append('tags', 'javascript');
params.append('tags', 'css');
const url = `https://api.example.com/search?${params}`;
// "https://api.example.com/search?q=...&sort=desc&page=1&limit=20&tags=javascript&tags=css"
Convenciones comunes para parámetros de array
| Convención | Ejemplo | Framework del servidor |
|---|---|---|
| Claves repetidas | ?tags=js&tags=css |
Express, Koa |
| Sufijo con corchetes | ?tags[]=js&tags[]=css |
PHP, Rails |
| Subíndice | ?tags[0]=js&tags[1]=css |
PHP |
| Separados por coma | ?tags=js,css |
Personalizado |
Preguntas Frecuentes
¿Por qué el espacio en URL a veces es %20 y a veces +?
- En la ruta URL: espacio =
%20(estándar) - En los parámetros de consulta: espacio =
+o%20(+es la convención de application/x-www-form-urlencoded) - Recomendación: usar
%20uniformemente, evitar ambigüedad
¿Las URL tienen un límite máximo de longitud?
| Escenario | Límite |
|---|---|
| Barra de URL de Chrome | 2MB |
| Barra de URL de Firefox | Sin límite |
| Barra de URL de IE | 2083 caracteres |
| Petición HTTP GET | El servidor decide (generalmente 8KB) |
| Límite seguro | 2048 caracteres (compatible con todos los navegadores) |
Los parámetros que superen los 2048 caracteres deben usar peticiones POST.
Resumen
La URL es la piedra angular de la Web; comprender su estructura, reglas de codificación y tratamiento seguro es una habilidad fundamental para cada desarrollador. Puntos clave: codificar valores de parámetros con encodeURIComponent, verificar protocolos para prevenir XSS, validar con lista blanca para prevenir redirección abierta. La herramienta de Codificación/Decodificación URL de ToolsKu te ayuda a manejar rápidamente problemas de codificación URL.
#URL解析#URL编码#查询参数#Web开发#教程