Aunque la seguridad de las aplicaciones web ha seguido siendo un aspecto importante en el desarrollo de software, la cuestión ha adquirido una importancia primordial debido a las mayores apuestas empresariales y a las inversiones en las aplicaciones, y una vulnerabilidad de la seguridad puede realmente hacer mella en la reputación de la empresa y en su capacidad para hacer negocios.
En este artículo, hablaré de la validación en Laravel y de cómo puedes sanear las entradas de los formularios para evitar que los exploits XSS de Laravel dañen tus aplicaciones Laravel.
- ¿Por qué necesitamos la higienización de las entradas?
- Posibles puntos de explotación XSS
- Reglas de validación de Laravel por defecto
- Saneamiento Laravel
- Cómo añadir middleware para comprobaciones de validación de entradas de usuario
- Buenas prácticas para la protección XSS en una aplicación Laravel
- Mantenlo seguro y desinfectado
¿Por qué necesitamos la higienización de las entradas?
Los piratas informáticos utilizan RFI (inclusión remota de archivos) y ataques de inyección como Cross-Site Script (XSS) y SQL Injection (SQLi) para explotar la conexión entre sitios web y servidores. Pueden ejecutar acciones no autorizadas que pueden comprometer la seguridad. Sin embargo, con la sanitización, estos ataques pueden evitarse.
La higienización de la entrada es un protocolo de seguridad para comprobar, filtrar y limpiar las entradas de datos de los usuarios de una aplicación. Los datos de entrada viajan a través de peticiones GET, peticiones POST y cookies, que los hackers pueden modificar, manipular y editar para obtener acceso al servidor en el que está alojada la aplicación web.

Ref. imagen: imperva.com
La higienización de la entrada no es perfecta ni la única opción para luchar contra diferentes ataques maliciosos. Pero tiene ventajas como
- Proporcionar una defensa perimetral contra los ciberataques habituales
- Prevención de ataques remotos de inclusión e inyección de archivos
- Proteger el sistema de códigos maliciosos
- Salvaguardar el servidor web, la base de datos y otros activos digitales
Mantén seguras tus aplicaciones en la nube
Cloudways ofrece 2FA, SSL gratuito y funciones de seguridad más avanzadas en servidores gestionados que mantienen segura tu aplicación.
Posibles puntos de explotación XSS
Hay diferentes formas en las que un hacker puede atacar tu aplicación web Laravel. Los siguientes son algunos ejemplos a tener en cuenta:
Guión en Atributos
Los ataques XSS pueden realizarse sin utilizar el <guión>…</script> etiquetas. Otras etiquetas harán exactamente lo mismo, como <body onload=alert(‘test1’)> u otros atributos como onmouseover u onerror.
al pasar el ratón sobre
<b onmouseover=alert('Wufff!')>¡hazme clic!</b>
onerror
<img src="https://url.to.file.which/not.exist" onerror=alert(document.cookie);>
Guión mediante esquemas URI codificados
Si necesitamos ocultarnos contra los filtros de las aplicaciones web, podemos intentar codificar caracteres de cadena, por ejemplo: a=&\#X41 (UTF-8) y utilizarlo en las etiquetas IMG:
<IMG SRC=jAvascript:alert('prueba2')>
Muchas notaciones de codificación UTF-8 diferentes nos dan aún más posibilidades.
Codificación del código
Podemos codificar nuestros scripts en base64 y colocarlos en la Metaetiqueta. De esta forma nos libramos completamente de alert().
<META HTTP-EQUIV="actualizar" CONTENT="0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgndGVzdDMnKTwvc2NyaXB0Pg">
Reglas de validación de Laravel por defecto
- obligatorio: Sólo se acepta si el valor no es nulo. Laravel anula la entrada si el campo se deja vacío.
- correo electrónico: Sólo se acepta si la entrada está en formato de correo electrónico, [email protected]
- a veces: Un campo de formulario web que puede estar ahí debido a una opción seleccionada en el formulario. En ese caso, puedes especificar a veces | obligatorio
Saneamiento Laravel
La sanitización de la entrada incluye las técnicas para identificar y eliminar las posibles entradas de cadenas que pueden ser perjudiciales para tu aplicación.
Ejemplo:
Así es como puedes limpiar la entrada eliminando las etiquetas de script mediante la función PHP strip_tags.
Route::post('/tarea', function (Petición $petición) {
$nombre_limpio = strip_tags($request->input('nombre'));
$tarea = nueva Tarea;
$tarea->nombres = $nombre_limpio;
$tarea->guardar();
devuelve redirect('/');
Cómo añadir middleware para comprobaciones de validación de entradas de usuario
Echemos un vistazo a cómo añadir la autorización y la validación al mismo tiempo en los formularios web. Laravel ofrece una clase Request para este propósito.
Puedes crear un formulario con esta clase Petición utilizando el siguiente comando:
Php artisan make:middleware XssSanitización
Este comando generará por defecto la siguiente clase en app/Http/Middleware/XssSanitization.php
namespace App\Http\Middleware;
Utiliza el cierre;
utiliza Illuminate\Http\Request;
clase XssSanitizer
{
función pública handle(Solicitud $request, Cierre $next)
{
$entrada = $petición>todo();
array_walk_recursive($entrada, function(&$entrada) {
$entrada = strip_tags($entrada);
});
$petición->fusionar($entrada);
devuelve $siguiente($petición);
}
}
A continuación, registra este middleware en nuestro archivo app/Http/Kernel.php y añade la siguiente línea en la matriz $routeMiddleware.
clase Kernel extends HttpKernel
{
....
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
....
'XssSanitizer' => \App\Http\Middleware\XssSanitizer::clase,
];
}
Ahora puedes utilizar el middleware XssSanitization en las rutas.
Ruta::grupo(['middleware' => ['XssSanitizer']], function () {
Ruta::get('view-register', 'RegisterController@viewRegisterPage');
Route::post('registrar', 'RegisterController@registerAction);
});
Buenas prácticas para la protección XSS en una aplicación Laravel
He aquí algunos puntos clave para la mejor aplicación de este procedimiento.
- Añade capas de protección. La redundancia mejora la seguridad. Al añadir más capas, tienes más posibilidades de detectar entradas maliciosas que podrían escapar a la seguridad inicial.
- No pases por alto la validación del lado del cliente. Este tutorial se centraba en la validación del backend, pero podrías añadir fácilmente una nueva capa de protección del front-end utilizando HTML/JavaScript. Por ejemplo, puedo limitar la longitud de la entrada mediante HTML:
<input type=»text» name=»tarea» maxlength=»10″> - Como alternativa, podría haber utilizado una función JS para validar/sanitizar la entrada.
function validateForm() {
var x = document.forms[«myTasksForm»][«task»].value;
if (x == null | x == «» || x.length > 10) {
alert(«La tarea no debe estar vacía y debe tener menos de 10 caracteres»);
return false;
}
} - Codificar las URL para denegar el acceso a los parámetros Get.
- Utilizando un sistema de plantillas de auto-eliminación como las plantillas de Laravel Blade.
- Utilizando bibliotecas diseñadas específicamente para desinfectar la entrada HTML:
- Purificador PHP Html
- .Net HTML sanitizer («La biblioteca está probada unitariamente con la hoja de trucos de evasión de filtros XSS de OWASP»)
- OWASP Java HTML Sanitizer
- Blanqueador Pitón
- Para obtener una lista exhaustiva y actualizada de prácticas, consulta The Open Web Application Security Project (OWASP).
- Estandarización a nivel de cabecera de Content-Type y asegurarse de que el tipo de respuesta del servidor no es«text / html» y evitar que el navegador autodetecte el tipo de datos ‘nosniff‘.
- Implanta una Política de Seguridad de Contenidos (PSC) para limitar las consecuencias negativas cuando se inserta código malicioso.
Mantenlo seguro y desinfectado
Los frameworks de desarrollo web fijan y actualizan sus normas de codificación para superar muchas posibles vulnerabilidades. No todas las vulnerabilidades pueden solucionarse a nivel de herramienta o marco. En el día a día, la responsabilidad de los desarrolladores web o del administrador es garantizar que su aplicación no permita a los piratas informáticos explotar ninguna vulnerabilidad conocida.
Hazme saber en la sección de comentarios de abajo si conoces algún consejo que pueda ayudar a prevenir los ataques XSS de Laravel, y lo revisaré y añadiré al artículo.
Shahzeb Ahmed
Un creativo de día (con una taza de té) y un creativo de noche. Ahmad Kamran es redactor de contenidos estacionales y Ejecutivo de Marketing Senior en Cloudways. Puedes encontrarle en su escritorio escribiendo, elaborando estrategias o jugando. Y en caso de que no puedas encontrarle aquí, estará en la montaña o junto a la orilla del río.