En esta página:
Las aplicaciones creadas con Node JS pueden ser muy geniales, hay aplicaciones que nos permiten interactuar en tiempo real mediante sockets, esto permite que múltiples usuarios que estén mirando la misma interface vean los mismos cambios al mismo tiempo, también una aplicación creada con Node JS suele tener mejor velocidad y rendimiento en comparación con otras tecnologías o lenguajes de programación, pero nos olvidamos de la seguridad de la aplicación y en este Post te quiero compartir algunos consejos para que la mantengas protegida de usuarios maliciosos, vamos con ello.
Antes de continuar, te invito a leer los siguientes artículos.
- 5 Consejos de Seguridad para tu Proyecto Creado con WordPress
- Como implementar reCAPTCHA v3 de Google en un Formulario HTML
- Como implementar el Sistema Anti Spam Google no Captcha reCaptcha V2 (Actualizado 10-09-2019)
- Puedes leer más en la categoría Seguridad
Asimismo, te invito a escuchar el Podcast: “En Cuanto Tiempo Puedo Ser Un Buen Programador ?”:
Spotify: | Sound Cloud: | Apple Podcasts |
Bien ahora continuemos con el Post: Consejos Para Proteger Nuestras Aplicaciones Creadas con Node JS.
Node JS es un ambiente en tiempo de ejecución multiplataforma, hasta la fecha de este Post aún es de código abierto, esta basado en JavaScript y funciona del lado del servidor, probablemente lo estés utilizando en tus proyectos y te compartiré algunos consejos para que los mantengas seguro.
Autenticación en tu API REST con JWT
Si tienes Endpoints en tu API REST te recomiendo implementarles JWT (JSON Web Tokens), que brinda autenticación de usuarios mediante tokens a fin de obtener acceso a los recursos de los Endpoints. Si quieres saber más sobre JWT, puedes visitar la página oficial de esta tecnología en este enlace.
Mediante los JWT el usuario deberá enviar un token para poder tener acceso a los datos del servidor, por ejemplo si quiere obtener una lista de productos en la ruta o endpoint /productos, pues tendrá que enviar el token mas o menos con este formato tudominio.com/productos?token=as6asd87sa5da8asd8s8a7da87sda5asd8asd
Manejo de Errores
La comunidad de Node JS recomienda que se pasen los errores en las devoluciones de llamada (Callbacks) como primer argumento, ya que los errores solo ocurren en las operaciones asíncronas. Puedes hacer uso de async / await para obtener el flujo de control asíncrono como desees.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
async function email(correousuario) { try { // Has Algo asíncrono... await sendEmail({ to: correousuario, from: 'noresponder@dominio.com', asunto: 'Hola' }); } catch(err) { if (err instanceof SomeCustomError) { elegantlyHandleError(err) } else { throw err } } } |
Si quieres saber más acerca de la función async / await, puedes leer la documentación oficial de JavaScript en este enlace.
Evita la Cross-Site Request Forgery (CSRF)
Cross-Site Request Forgery traducido al español significa Falsificación de Solicitudes Entre Sitios y es una técnica que permite a los usuarios maliciosos realizar tareas poco éticas usando el nombre de la victima. CSRF explota una vulnerabilidad en la aplicación donde la solicitud real y la solicitud falsificada no se pueden diferenciar. Imagina por un momento que pasa si el atacante cambia la contraseña de tu cuenta bancaria y transfiere todo tu dinero, estos ataques se denominan secuestro de sesión en el que el atacante maneja la sesión del usuario para lograr sus cometidos.
Existe un paquete NPM llamado csurf que te brinda protección mediante un Middleware en Node JS. Puedes instalarlos ejecutando el siguiente comando.
1 2 3 4 |
// Instalar paquete 'csurf' desde NPM npm install --save csurf |
Luego puedes usar el middleware CSRF de la siguiente manera.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
const cookieParser = require('cookie-parser'); // Paquete 'csurf' const csrf = require('csurf'); const bodyParser = require('body-parser'); const express = require('express'); const csrfProtection = csrf({ cookie: true }); const parseForm = bodyParser.urlencoded({ extended: false }); const app = express(); // Analizar cookies // necesitamos esto porque "cookie" es verdadera en csrfProtection app.use(cookieParser()); app.get('/formulario', csrfProtection, function (req, res) { // pasamos el csrfToken a la vista res.render('enviar', { csrfToken: req.csrfToken() }) }) app.post('/proceso', parseForm, csrfProtection, function (req, res) { res.send('Los datos se están procesando') }) |
Por ende, podemos enviar el valor del token a la vista.
1 2 3 4 5 6 7 |
<!-- Vista HTML del formulario --> <form action="/proceso" method="POST"> <input type="hidden" name="_csrf" value="{{csrfToken}}"> <button type="submit">Enviar</button> </form> |
Mantén seguro el mecanismo CORS de tu proyecto
El termino Cross-Origin Resource Sharing (CORS) traducido al español significa Uso Compartido de Recursos de Origen Cruzado y es una tecnología que describe nuevos encabezado HTTP que brindan a los navegadores una forma de solicitar URLs remotas solo cuando tienen permiso. Esto es útil cuando se intenta realizar una llamada API a un dominio diferente al del propietario, este será bloqueado por la función del navegador llamada política del mismo origen.
La plataforma NPM cuenta con un paquete llamado cors que te proporciona un middleware Connect/Express para habilitar y gestionar el CORS en tu proyecto, puedes instalarlo ejecutando el siguiente comando.
1 2 3 4 |
// Instalar el paquete 'cors' npm install --save cors |
Paso seguido podemos implementarlo en nuestra aplicación, mas o menos de la siguiente manera.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// Paquete 'cors' var cors = require('cors'); var app = express(); app.use(cors()); app.use(function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header('Access-Control-Allow-Methods', 'DELETE, PUT, GET, POST'); res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); next(); }); |
En la documentación oficial del paquete puedes encontrar funciones más avanzadas.
Utiliza Cookies de forma Segura
Las cookies o galletas en español, se utilizan de manera amplia en las páginas web para identificar la sesión del usuario, almacenar algunos datos en los navegadores del usuario, lo que permite que el servidor web reconozca al usuario mientras navega por el sitio y en general contienen datos confidenciales.
Al configurar tus cookies te recomiendo considerar los siguientes puntos:
- Evita almacenar datos confidenciales en una cookie, a menos que sea necesario.
- Utiliza HttpOnly para mitigar los ataques XSS o Cross-Site Scripting.
- Has uso de SameSite para mitigar los ataques CSRF.
- Utiliza Secure para mitigar los ataques MITM, esto te permitirá prohibir la transmisión de una cookie a través de HTTP simple.
Puedes instalar el paquete NPM llamado express-session para almacenar datos de la sesión de un usuario en el servidor y la identificación en la propia cookie y no en los datos de la sesión. Para instalar el paquete puedes ejecutar el siguiente comando.
1 2 3 4 |
// Instalar el paquete 'express-session' npm install --save express-session |
Paso seguido usamos un middleware de sesión rápida.
1 2 3 4 5 6 7 8 |
var express = require('express'); // Paquete 'express-session' var session = require('express-session'); app.use(session({secret: 'secret_'})); |
Y también usamos un mi middleware de sesión de cookies.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
const expressSession = require('cookie-session') // Que expire en 10 días var tiempoDeExpiracion = new Date(Date.now() + 10 * 24 * 60 * 60 * 1000); const sesion = expressSession({ secret: sessionSecret, resave: false, saveUninitialized: true, cookie: { secureProxy: true, httpOnly: true, domain: 'midominio.com', expires: tiempoDeExpiracion } }) app.use(sesion) |
Si quieres conocer más sobre este paquete, puedes visitar su documentación oficial en el repositorio NPM.
Utiliza Bcrypt
Es probable que no sepamos exactamente cuál es el algoritmo secreto que usan los usuarios malintencionados y el hecho de que uno mismo no pueda descifrarlo, tiende a ser irrelevante. Enfócate en generar o usar el algoritmo de tal manera que otros no puedan romperlo.
Un atacante puede utilizar herramientas comunes como cifrados por sustitución o cifrados polialfabéticos para recuperar el texto sin formato del texto cifrado. No uses tu propio sistema de criptografía, usa los que sean estándares en la industria en su lugar. Uno de los más utilizados es Bcrypt, ha existido durante bastante tiempo y permanece intacto hasta la fecha, es una función de has de contraseña. Puedes utilizar este paquete NPM llamado bcrypt en tus proyectos.
Conclusión
Hemos visto en este Post algunos consejos que pueden mantener segura tu aplicación y también a tus usuarios, te recomiendo buscar nuevas formas de ataque, nuevas tendencias que los usuarios maliciosos están utilizando, estar actualizado te ayudará mucho.
Nota(s)
- No olvides que debemos usar la Tecnología para hacer cosas Buenas por el Mundo.
Síguenos en nuestras Redes Sociales para que no te pierdas nuestros próximos contenidos.