Herramientas de desarrollo · Codificador y decodificador de URL
La codificación de URL no es desinfección: los parámetros decodificados aún deben escaparse
· Por qué es importante
codificación de URL seguridad xss
La codificación porcentual protege la estructura de la URL, no su HTML, SQL o shell. Esta publicación explica por qué un valor codificado correctamente vuelve a ser peligroso en el momento en que se decodifica y qué escape pertenece a dónde.
Por qué la codificación de URL por sí sola no puede detener los ataques XSS
Un parámetro "seguro" puede ejecutar un script si está codificado para su transmisión pero decodificado antes de renderizarlo. Considere la carga útil XSS como la etiqueta img con el controlador de errores codificado por ciento como %3Cimg%20src%3Dx%20onerror%3Dalert%281%29%3E. Si esto viaja en una URL y se decodifica mediante el código de la aplicación antes de insertarlo en HTML, el navegador ve el marcado original y ejecuta el controlador. La codificación porcentual es una capa de representación; no cambia la amenaza subyacente.
La carga útil es segura solo durante la transmisión, cuando es una cadena codificada sin significado especial para el analizador HTTP o URL. En el momento en que se decodifica, vuelve a ser peligroso porque vuelve a su forma original. Cada contexto posterior debe aplicar sus propias reglas de escape apropiadas a cómo utilizará los datos. La codificación de URL no sustituye el escape HTML, la parametrización de SQL o el manejo de argumentos de shell.
Para qué sirve la codificación porcentual: mantener los delimitadores sin ambigüedades en el cable, nada más
Lo que hace la codificación porcentual es proteger la estructura de la URL con precisión. El signo comercial sigue siendo parte de la sintaxis de la cadena de consulta y no se reinterpreta como delimitador. La barra diagonal no se convierte en separador de ruta. El signo de interrogación no comienza con el fragmento. Al codificar caracteres reservados como %XX, el analizador los trata como datos, no como sintaxis. Esto funciona para un trabajo: mantener la estructura de la URL sin ambigüedades en la red.
La decodificación invierte exactamente esa calle de sentido único. Los bytes restaurados son exactamente lo que se codificó, nada más y nada menos. La cadena HTML peligrosa sigue siendo peligrosa, el vector de inyección SQL sigue siendo peligroso y el comando de shell sigue siendo peligroso. La codificación porcentual no es validación de entrada, ni desinfección ni límite de seguridad. Es sólo formato de representación.
La decodificación restaura los bytes originales, por lo que cada contexto posterior vuelve a ver el valor sin procesar.
El escape específico del contexto es donde realmente vive la protección real. El contexto HTML necesita entidades: menor que se convierte en <, mayor que se convierte en >, las comillas se convierten en ", el signo comercial se convierte en &. El contexto SQL necesita consultas parametrizadas que separan la estructura de los datos, evitando que el atacante se escape. El contexto Shell necesita matrices de argumentos que eviten la división de palabras y la agrupación por completo.
Cada contexto tiene diferentes personajes peligrosos y diferentes reglas de escape precisamente. La entidad HTML es inofensiva en consultas SQL pero inútil para la protección allí. La barra invertida evita la inyección de SQL en algunas bases de datos pero no en otras. El escape de Shell depende del estilo de las citas. El desarrollador debe comprender el destino antes de elegir cómo manejar los datos.
Escape específico del contexto: entidades HTML para marcado, consultas parametrizadas para SQL, matrices de argumentos para shells
Ejemplo resuelto: seguir la carga útil desde el enlace hasta el registro y la página revela dónde deben realizarse la codificación y el escape. El enlace contiene una carga útil XSS codificada como parámetro de consulta. El servidor lo recibe todavía codificado en el cuerpo de la solicitud HTTP. La aplicación decodifica el parámetro de consulta para mostrarlo en la página. Sin que se escape la salida, el navegador representa la carga útil como HTML y la ejecuta.
Si el mismo parámetro se registró en el archivo, la entrada del registro contiene la carga útil decodificada claramente. La segunda aplicación lee el registro, lo decodifica nuevamente y lo inserta en la página HTML sin escapar. La carga útil se ejecuta por segunda vez. En cada paso, el contexto determinó lo que era seguro. La decodificación de URL era segura. El almacenamiento de archivos era seguro. Pero la salida HTML sin escape fue fatal.
Ejemplo resuelto: seguir una carga útil desde el enlace para iniciar sesión en la página: dónde está codificada, dónde está decodificada, dónde debe escaparse
La codificación como herramienta de evasión de filtros muestra por qué los atacantes codifican dos veces y mezclan mayúsculas y minúsculas de manera significativa. Si el firewall busca la etiqueta img, el atacante envía %3Cimg y espera que la aplicación se decodifique una vez, pero el firewall no. Si la validación rechaza %3Cimg pero permite mayúsculas y minúsculas diferentes, los mismos bytes se decodifican en la misma carga útil. La seguridad que depende de la entrada codificada que coincida con patrones es frágil.
La decodificación debe ser exacta y absolutamente predecible. La forma canónica (hexadecimal en minúsculas, codificación conocida) permite una política coherente pero no resuelve el problema subyacente. El único enfoque confiable es permitir la decodificación cuando sea necesario y aplicar un escape de salida específico del contexto inmediatamente antes de su uso. La decodificación nunca es segura; Sólo es necesario para la transmisión.
Codificación como herramienta de evasión de filtros: por qué los atacantes codifican dos veces y mezclan mayúsculas y minúsculas, y por qué la decodificación debe ser exacta
La defensa XSS completa requiere comprender completamente los flujos de datos, los contextos por los que pasan en cada paso y lo que se necesita para escapar de cada contexto. La codificación de URL es una pequeña pieza: conserva la estructura sólo durante la transmisión. Pero una pieza nunca es defensa por sí sola. Muchos desarrolladores combinan la codificación con la desinfección porque ambas implican reemplazar caracteres, pero cumplen tareas importantes completamente diferentes.
Web Application Firewall puede detectar patrones en las cargas útiles de solicitudes, pero la codificación evade fácilmente las técnicas simples de coincidencia de patrones. El ajuste de WAF es complejo y va más allá de la codificación de URL. La defensa confiable es el escape de salida en el código de la aplicación, junto con la validación de entrada cuando tenga sentido para su contexto y requisitos específicos.
Lo que esto no cubre: una guía completa de defensa XSS o ajuste del firewall de aplicaciones web
La defensa XSS completa requiere comprender completamente los flujos de datos, los contextos por los que pasan en cada paso y lo que necesita cada contexto para escapar en toda la aplicación. La codificación de URL es una pequeña pieza: conserva la estructura sólo durante la transmisión. Pero una pieza nunca es defensa por sí sola. Muchos desarrolladores combinan la codificación con la desinfección porque ambos implican reemplazar caracteres, pero cumplen tareas importantes completamente diferentes a lo largo del desarrollo.
Pruebe la carga útil de un extremo a otro para ver dónde la codificación y el escape son realmente importantes durante todo el proceso. Pegue %3Cimg%20src%3Dx%20onerror%3Dalert%281%29%3E en el decodificador de URL y observe cómo se convierte en una cadena que parece un marcado. Luego pegue el resultado en el escape de entidad HTML para ver cómo se convierte en texto seguro. Dos herramientas muestran capas claramente visibles.
Conclusión: codificar para la URL, escapar para la salida: cómo el codificador y decodificador de URL y el escape de entidad HTML se ubican uno al lado del otro en un producto para los dos trabajos diferentes
La conclusión es que la codificación y el escape son preocupaciones separadas en diferentes capas en todo momento. La codificación de URL protege únicamente la estructura transmitida. El escape de salida protege el contenido renderizado. El valor codificado correctamente aún necesita que la salida se escape cuando llega a HTML. La cadena con escape correcto nunca necesita codificación de URL si no se coloca en la URL.
Aplique genuinamente la defensa derecha en la capa derecha. No confíe en la codificación de URL para detener los ataques XSS. No confíe en el escape HTML para preservar la estructura de la URL. Comprenda su flujo de datos y aplique la transformación adecuada en cada paso. El codificador de URL le ayuda a ver qué hace la codificación; luego use el escape de entidad HTML para el paso de salida.