No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Cómo evitar parámetros incorrectos

21/23
Recursos

Los DTO ayudan con el tipado y la validación de datos, además de indicar la obligatoriedad de los mismos para que los registros se creen completos. Es importante también evitar que haya datos que no deben estar en las solicitudes, ya que podrían ser ataques maliciosos.

Cómo hacer la prohibición de datos

Busca el archivo main.ts que contiene el bootstrap de tu aplicación, es decir, el punto inicial de la misma. Agrega aquí la siguiente configuración.

// main.ts
import { NestFactory } from '@nestjs/core';
import { ValidationPipe } from '@nestjs/common';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(
    new ValidationPipe({
      whitelist: true,                    // Ignorar datos que no esten en los DTO
      forbidNonWhitelisted: true,         // Lanzar error si existen datos prohibidos
      disableErrorMessages: true,         // Desabilitar mensajes de error (producción)
    })
  );
  await app.listen(process.env.PORT || 3000);
}
bootstrap();

Importa ValidationPipe desde @nestjs/common y configura en true las propiedades whitelist para ignorar datos que no estén en el DTO. Usa forbidNonWhitelisted para lanzar errores si existen datos prohibidos y disableErrorMessages que es recomendable activarlo solo en producción para no enviar mensajes de error y no dar información al front-end.

De esta simple manera, tus endpoints gracias a los DTO son súper profesionales, seguros y contribuyen a una buena experiencia de desarrollo.

// src/main.ts

app.useGlobalPipes(
  new ValidationPipe({
    whitelist: true,
    forbidNonWhitelisted: true,
  }),
);

Contribución creada por: Kevin Fiorentino.

Aportes 14

Preguntas 9

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Creo que prohibir datos que no se usan esta bien, aparte le va servir a las personas que consuman esa API. Ya que si tienen un typo enviando en el Body una propiedad, ejem: Enviar usename en vez de username. La API le avisara que no existe esa propiedad y le ahorraría la fatiga de encontrar el error que esta cometiendo 😅

Eliminar los parámetros recibidos que no estén definidos en los DTO

 whitelist: true,

Informar a la API que se está enviando un atributo no válido

 forbidNonWhitelisted: true,
Es una decisión no tan fácil de tomar, dependiendo el contexto deberías decidir si avisar o no del dato incorrecto, ya que efectivamente ayuda mucho a quien consume la api pero también ayudará al hacker malicioso a determinar que puede y que no puede hacer. Recordemos que el hacker examina, prueba y explota.

También es muy importante activar disableErrorMessages en los entornos productivos para no enviar mensajes al front-end y no dar información sobre qué está pasando en el backend y por qué está fallando.
Todas estas validaciones se pueden realizar de forma genérica en el Bootstrap de NestJS de la siguiente manera:

// main.ts
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(
    new ValidationPipe({
      whitelist: true,                    // Prohibir datos que no esten en los DTO
      forbidNonWhitelisted: true,
      disableErrorMessages: process.env.ENVIRONMENT == 'production' ? true : false,
    })
  );
  await app.listen(process.env.PORT || 3000);
}
bootstrap();

Hasta ahora en las request te pueden mandar otros campos que no correspondan con tu DTOs y los guarda.

Para evitar guardar esos campos tenemos que configurar en el main.ts el ValidationPipes las propiedad whitelist en true y si queremos ser restrictivos, tenemos que setear forbidNonWhitelisted en true

Implementacion con los cambios

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(
    new ValidationPipe({
      whitelist: true,
      forbidNonWhitelisted: true,
    }),
  );
  await app.listen(3000);
}

Con estos cambios, al momento de enviar un request, con un campo demas, vamos a obtener:

{
  "statusCode": 400,
  "message": [
    "property otro should not exist"
  ],
  "error": "Bad Request"
}

Que gran profesor, se hace entender muy bien.

Para ignorar todos los datos adicionales del payload que no estuvieron defenidos en el dto utlizar whitelist : true

@Contribución creada por: Kevin Fiorentino.

Master muchas gracias por el aporte en los recursos…

Son todos bienvenidos. ❤️❤️

En la clase anterior vimos estos conceptos :

De los cuales hasta ahora viendo esto atributo, no me funcionaban, para que tengan presente:

No seria mejor validar dato por dato y omitir los que no queramos?

Por ejemplo, si yo pido 2 propiedades en el body, name y username, y el cliente me pasa 3, digamos, password. Yo en mi controller/service lo que hago es que ya se que datos quiero, name y username, entonces creo un objeto nuevo donde almaceno solo los datos que quiero y con ese objeto escribo o consulto en la base de datos

Hacer la restricción mas fuerte con forbidNonWhitelisted: true

Restringir datos incorrectos o maliciosos

puso las dos validaciones en main,ts pero me sigue dejando crear con los campos que no existen sin arrojar ningun mensaje

👏