Cómo evitar ataques XSS
En este post veremos cómo evitar ataques XSS, veremos como evitar en parte ataques de esta característica en el Front-End y veremos que debemos hacer en la parte del Back-End.
Introducción
¿Qué es un ataque XSS?
Las siglas XSS viene de cross site scripting, ¿qué es esto? Se puede decir que es un tipo de inyección muy parecida a la inyección SQL excepto que esta vez trataran de guardar código de tipo script en nuestra página web. Generalmente, este código está escrito en JavaScript o también puede ser HTML que redirija a otra web para realizar phishing.
Algunos ejemplos de ataques que pueden hacerle a tu sitio:
Redirección del Usuario<script> window.location.href = 'http://sitio-malicioso.com'; </script>Robo de Cookies
<script> var cookies = document.cookie; // Enviar cookies a un servidor controlado por el atacante </script>Keylogging
<script> document.onkeypress = function(e) { // Enviar las teclas presionadas a un servidor controlado por el atacante }; </script>Manipulación del DOM
<script> document.getElementById('elemento').innerHTML = 'Contenido malicioso'; </script>
Hay otros ataques como el phishing y el de poner publicidad en tu sitio sin tu consentimiento.
[ADS_A1/]Front-End
En el Font-End lo que se recomienda es separar tu HTML de tu JavaScript, por lo que no debería haber inline-codes de JavaScript
En cambio, se recomienda algo parecido a lo siguiente.
tu boton<button id="miBoton">Haz clic</button>en tu archivo .js
<script> document.getElementById("miBoton").addEventListener("click", miFuncion); </script>
Ahora lo que deberías hacer es configurar tu CSP para que no permita inline-code y otras configuraciones que desees, por ejemplo que no permita la ejecución de scripts de otras páginas, excepto las de Google, ya que necesitaremos que este registre nuestra página.
Puedes ver sobre más sobre Content Security Policy en CSP en PHP
[ADS_A2/]Back-End
En el Back-End, sin embargo, aunque hemos prácticamente evitado que nos hagan el ataque, deberíamos de escapar lo ingresado por el usuario, en PHP por ejemplo utilizando la función htmlspecialchars()
, aunque es aún más recomendable utilizar los filtros
$user_input = $_POST['user_input']; // Escapar los datos ingresados por el usuario utilizando el filtro FILTER_SANITIZE_SPECIAL_CHARS $escaped_input = filter_var($user_input, FILTER_SANITIZE_SPECIAL_CHARS); // Sanitizar los datos ingresados por el usuario(eliminara los caracteres no seguros) $sanitized_input = filter_var($user_input, FILTER_SANITIZE_STRING);
Aunque puedes hacer esto, es aún más recomendable crear una clase validation para así poder validar que lo que se ingrese cumpla con los requisitos, por ejemplo verificar si es un correo, si es un número, etc y además de eso sanitizar con los filtros anteriormente vistos
Algunas veces podemos querer que el usuario pueda ingresar código HTML, pero no cualquier código HTML por ejemplo: las etiquetas<script>, <object> y algunas otras.
Para hacer esto puedes utilizar la biblioteca de PHP HTMLPurifier
La siguiente clase de código no debería estar en tu front-end
inline-code Javascript dentro del HTML tambien es considerado inline