Cómo proteger una API REST de NodeJS de ataques
Al ser un desarrollador back-end, una de las tareas más importantes es hacer que la API sea segura frente a diferentes tipos de ataques. Como desarrollador back-end, es posible que haya oído hablar de diferentes ataques a servidores como XSS, ataques de inyección de SQL, ataques de DOS y otros ataques similares, así que hoy te enseñaremos cómo proteger una API REST de NodeJS.
Es muy necesario escribir el código de manera que no se vea afectado por estos ataques. Entonces, en este artículo, veremos los pasos necesarios que se deben tomar mientras se trabaja con Node.js para evitar este tipo de ataques.
Ataques más comunes: Cómo proteger una API REST de NodeJS
1. Ataques DOS
El ataque de DOS principalmente aplasta/apaga el servidor de alojamiento o una red que lo hace inalcanzable para el usuario previsto. Nadie podrá utilizar la aplicación alojada. En este tipo de ataques, los atacantes usan secuencias de comandos para enviar continuamente la solicitud, creando un gran tráfico en el servidor simultáneamente. Hay dos métodos generales de ataques DoS: servicios de inundación o bloqueo de servicios. Los ataques de inundación ocurren cuando el sistema recibe demasiado tráfico para que el servidor lo almacene en el búfer, lo que hace que se ralenticen y finalmente se detengan.
Evitar una API de NodeJS de los ataques de DOS
Para evitar este límite de ataques, debe establecerse para la solicitud de entrada y si está utilizando Express Framework, entonces es muy fácil para el desarrollador manejarlos porque Express Framework tiene capacidades integradas para manejar esto. Para los ataques de DOS, Express tiene un análisis de cuerpo incorporado que se puede utilizar. Podemos usar el analizador de cuerpo para limitar el tamaño del cuerpo de entrada.
const express = require('express');
const app = express();
app.use(express.json({ limit: '20kb' })); // Here input body limit is 20 kb
Otro paquete de npm que se puede usar para prevenir ataques de DOS es express-rate-limit , que establece principalmente el límite de solicitudes provenientes de un usuario/máquina específico. Si el usuario toca el límite proporcionado en un tiempo específico, NodeJS lo bloqueará para realizar más solicitudes y le mostrará un mensaje de error.
const limit = rateLimit({
max: 100,// max requests
windowMs: 30 * 60 * 1000, // 1 Hour
message: 'You have touched the maximum limit of request' // error message
});
app.use('/route', limit); // Setting limit on specific route
2. Inyección SQL/NoSQL
Es un tipo de inyección donde los atacantes pueden insertar código/comando/consulta malicioso que puede romper la autenticación. En este ataque, el atacante inserta principalmente la consulta SQL/NoSQL en un campo de entrada específico en la aplicación que luego se usa en la consulta de la base de datos. Este ataque omite principalmente la autenticación, la autorización, recupera el contenido de la base de datos SQL/NoSQL completa y realiza tareas como crear, modificar y eliminar datos en la base de datos.
Prevención de ataques de inyección SQL/NoSQL
Para un desarrollador, debería ser una práctica muy común desinfectar los datos de entrada que pueden ser fácilmente administrados por los paquetes NPM disponibles. Para el nodo de la base de datos SQL , el paquete mysql se puede usar para la desinfección de datos. Y si se usa MongoDB, entonces se puede usar el paquete NPM express-mongo-sanitize para la tarea requerida.
3. Script entre sitios (XSS)
Este es un tipo de ataque en el que el atacante inserta el script no deseado en forma de script del lado del cliente (navegador), principalmente sobre formularios de entrada que están codificados o validados.
Prevenir una API de NodeJS de ataques XSS
1. Para este ataque, podemos usar el paquete NPM xss-clean. Esta dependencia evita principalmente que los usuarios inserten scripts/HTML en la entrada.
2. El paquete Helmet NPM lo ayuda a proteger sus aplicaciones Express configurando varios encabezados HTTP/especiales.
// Data Sanitization against XSS
app.use(xss());
// For various HTTP headers
app.use(helmet());
4. Ataques de fuerza bruta
En este ataque, los atacantes solían obtener datos confidenciales, como contraseñas de usuario o PIN/número de identificación personal. En tales ataques, lo más probable es que los atacantes usen software automatizado para generar grandes conjeturas de valores e intenten hacer coincidir si alguno coincide con la información del usuario. Los atacantes también pueden descifrar los datos guardados con el cifrado de 2 vías, por lo que los desarrolladores intentan utilizar métodos de cifrado unidireccionales.
Prevención de ataques de fuerza bruta
1. Si utiliza express, entonces el paquete express-rate-limit NPM puede hacer muchas cosas para usted. Este paquete NPM ayuda a prevenir tanto ataques de DOS como de fuerza bruta.
2. Uno de los enfoques más efectivos es limitar la solicitud donde se realiza el proceso de autenticación (como inicio de sesión, verificación de OTP). Para que ningún software automatizado pueda intentar romper la autenticación al hacer la solicitud tantas veces.
3. Guarde siempre los datos como contraseña, OTP en formato cifrado con un formato que no se pueda descifrar fácilmente. Hay tantos paquetes disponibles que hacen esta tarea. Prefiero usar el método que proporciona encriptación unidireccional y agregar una sal después de la encriptación.
4. Uno de los enfoques más populares que está siendo seguido por la organización más grande en el proceso de autenticación de dos pasos que funciona mejor con estos ataques.
Conclusión
Estos son ataques muy comunes para cualquier aplicación web, pero si está utilizando Node.js con el framework Express, entonces es muy fácil manejar estos ataques. Y como desarrollador, siempre debemos usar estas prácticas al desarrollar cualquier nivel de aplicación.