Lectores como tú ayudan a apoyar a MUO. Cuando realiza una compra utilizando enlaces en nuestro sitio, podemos ganar una comisión de afiliado. Leer más.

Cross-Site Scripting, ampliamente conocido como XSS, es uno de los métodos de ataque más peligrosos empleados por ciberdelincuentes, por lo que es fundamental que todos los desarrolladores e investigadores de seguridad sepan qué es y cómo prevenir ataques. Entonces, ¿cómo puede tomar medidas contra la vulnerabilidad XSS? Utiliza HTML, JavaScript o DOM para mostrar los datos que un sitio web recibe del usuario. Una o más de estas tres áreas diferentes pueden trabajar juntas.

Cómo prevenir XSS usando HTML

XSS permite a los atacantes inyectar códigos maliciosos o scripts en páginas web, dirigidos a usuarios desprevenidos que visitan el sitio. Esto podría robar datos personales, redirigir a los visitantes a otro sitio creado por el ciberdelincuente o alterar el aspecto de la página web. Pero puedes evitar que esto suceda; por ejemplo, impidiéndoles insertar HTML.

instagram viewer

Imagina que tienes un sitio web con un libro de visitas. Digamos que sus visitantes que usan este libro de visitas pueden escribir sus nombres y mensajes aquí, y sus mensajes pueden verse públicamente. Un atacante que quiera hacer una prueba XSS en tu libro de visitas utilizará el área que has asignado para escribir un mensaje. Ese ciberdelincuente ejecutará un código JavaScript aquí. Por ejemplo, un atacante podría usar código JavaScript como:

<guion>alerta("El XS!")</script>

El atacante debe usar una etiqueta de secuencia de comandos para que esto tenga éxito. Si no lo hacen, el código JavaScript no funcionará. Debe codificar la declaración < para que los usuarios nunca puedan usar etiquetas HTML. Esto dificultará que el atacante trabaje con etiquetas HTML.

Cómo prevenir XSS usando JavaScript

La lógica en HTML también es válido en JavaScript. En algunas aplicaciones, es posible imprimir los datos recibidos por el sitio web del usuario con un código JavaScript.

Considere esta codificación:

<identificación p ="imprimir"></pag>
<guion>
documento.getElementById("prueba").innerHTML = "";
</script>

Imagina que un sitio web usa un bloque de código como el de arriba. El desarrollador usó una etiqueta "p" llamada "imprimir" aquí. Como puede ver en el código, un valor provendrá del parámetro "buscar" y el desarrollador quiere mostrar este valor entrante en la etiqueta "p". El desarrollador que realizó esta operación quería usar la característica innerHTML de JavaScript.

Ahora veamos la situación desde el punto de vista del ciberatacante. En tal caso, el atacante realizará una prueba XSS dentro de la etiqueta "script". Para ello, el atacante no necesita reiniciar la etiqueta, porque ya se está utilizando una etiqueta "script". El atacante podría entonces escribir una prueba como esta:

nombre de archivo.php? buscar=a" alerta("El XS!"); f= "

Este código aparecerá en el sitio web como:

documento.getElementById("prueba").innerHTML = " a" alerta("El XS!"); f="";

Ese ataque sería exitoso. Para comprender mejor el problema, examinemos una técnica de ejemplo más que podría usar un atacante. El hacker puede haber aplicado una prueba XSS como:

nombre de archivo.php? buscar=";</script><ellos>Fatih</em>

Así es como se vería cuando se ve desde el sitio web:

documento.getElementById("prueba").innerHTML = "";</script><ellos>Fatih</em>";

Esto puede parecer un poco extraño porque el atacante ha cerrado la primera etiqueta de "script" usando una estructura como "/script" aquí. Y así, el atacante puede reiniciar cualquier código JavaScript y HTML que desee.

Si piensa en estos dos ejemplos diferentes, protegerse de XSS parece bastante simple. La precaución necesaria sería codificar el " y ' caracteres que ve en el primer ejemplo. En el segundo ejemplo, codifique los caracteres < y >.

Cómo prevenir XSS usando DOM

En esta variante de XSS, los datos que el sitio web recibe del usuario pueden interferir con la propiedad de un elemento DOM. Por ejemplo, la información de color que el sitio recibe del usuario puede afectar el color de fondo de una tabla o todo el fondo de la página. Entonces, el usuario interfiere sin darse cuenta con los diseños de estilo del cuerpo y la tabla. El siguiente código es un buen ejemplo de esto:

<cuerpo bgcolor="<?php echo $_GET['color']; ?>"/>

Con esto, el sitio web utiliza el parámetro "color" recibido del usuario directamente en la propiedad "bgcolor" del elemento "cuerpo". Entonces, ¿qué podría hacer un atacante en este punto? Podrían ejecutar este código malicioso:

nombre de archivo.php? color=rojo" onload="alerta('El XS!')

Esto se ve así cuando se ve desde el sitio web:

<cuerpo bgcolor=" rojo" onload="alerta('El XS!') "/>

Para evitar que esto suceda, el desarrollador tendría que codificar el " personaje.

Sin embargo, hay un elemento más importante en JavaScript a tener en cuenta. El siguiente fragmento de código es un ejemplo de esto:

<un href="javascript: alerta ('El XS!')">

Esto significa que es posible ejecutar código JavaScript directamente. Una de las mejores medidas preventivas es asegurarse de que el sitio web verifique si los datos que recibe de los usuarios son una URL real. El método más simple es asegurarse de que haya expresiones como "HTTP" y "HTTPS" (la versión segura de HTTP) en la conexión.

Una función de ejemplo para prevenir XSS con PHP

Ha visto algunos ejemplos de cómo proteger una aplicación o un sitio web de los ataques XSS. Puede usar los fragmentos de código en esta tabla con PHP:

Codificar en HTML

htmlcaracteresespeciales($str, ENT_COMPAT)

Codificar en JavaScript y atributo DOM

htmlcaracteresespeciales($str, ENT_NOQUOTES)

Comprobación de URL

'/^(((https?)|(\/\/))).*/';

Tenga en cuenta que estos son solo ejemplos y variarán según el idioma del software que esté utilizando.

Puede crear una aplicación web con PHP y prueba los códigos que ves arriba para enviarlos por mensaje de texto. Si se pregunta cómo usar todos estos métodos, puede obtener algunas ideas del bloque de código PHP a continuación, que debería ser útil incluso si está usando un idioma diferente:

<?php
$datos = $_GET['datos'];

funciónen_atributo($str){
devolver htmlcaracteresespeciales($cadena, ENT_COMPAT);
// ENT_COMPAT codificará el carácter de comillas dobles (").
}

funciónin_html($str){
$enlace = '/^(((https?)|(\/\/))).*/';
si(!preg_match($enlace, $cadena))
{
devolver "/";
}
devolver $cadena;
}

$datos = in_attribute($datos);
$datos = in_html($datos);
$datos = real_url (datos);
?>

Proteja su sitio web de XSS y más

XSS es un vector de ataque popular utilizado por piratas informáticos. Por lo general, un valor de ruta en la URL, cualquier campo en su sitio web donde se pueden ingresar datos (como formularios y campos de comentarios), se puede usar para probar una vulnerabilidad XSS. Pero, por supuesto, hay muchos métodos diferentes que los ciberdelincuentes pueden usar para atacar un sitio, especialmente si tiene un sitio web que tiene muchos usuarios y oculta su información.