Website-Suche

javascript - Wie reinigt man NestJS-Eingaben richtig?


Ich frage das, da ich anscheinend keine klare Antwort bekommen kann.

Also, NestJS hat eine sehr elegante Methode, Validierung zu handhaben, indem es Dekoratoren verwendet. Das heißt, man definiert DTO-Klassen mit den Eigenschaften, die man erwartet, und versieht sie mit class-validator-Dekoratoren. Zum Beispiel nehmen wir an, wir haben eine Route, die Eingaben von einem Kontaktformular akzeptiert.

class ContactInfoDTO {
     @IsString()
     @IsNotEmpty()
     name: string
     
     @IsEmail()
     email: string
     
     @IsString()
     @IsNotEmpty
     subject: string

     @IsString()
     @IsNotEmpty()
     body: string

}

Das funktioniert großartig für die Validierung. Wenn ich eine ungültige E-Mail eingebe, wird sie wie erwartet abgelehnt. Aber hier ist meine Frage. Wie sieht es mit der Eingabe-Sanitisierung aus? Angenommen, ich gebe zum Beispiel etwas JavaScript in das Body-Parameter ein? Zum Beispiel, wenn mein Body so aussieht:

body: “Hello <script>//some malicious code here</script>”

Nun, das wird immer noch akzeptiert. Auch wenn die Skript-Tags nicht in HTML-Entitäten umgewandelt werden, was ein gewisses Sicherheitsrisiko darstellt.

Also, meine Frage ist, ob NestJS irgendeine Art von eingebauten Mechanismen zur Bereinigung hat? Gibt es dafür eine ordentliche Dokumentation? Denn ich kann wirklich nichts finden, obwohl so etwas im Kontext der Webentwicklung sehr wichtig ist.

Was ist die beste Praxis für die Eingabesanitisierung in NestJS?

Antwort #1

Verwenden Sie sanitize-html mit Transform wie folgt:

import { ApiProperty } from '@nestjs/swagger';
import { Transform } from 'class-transformer';
import { IsString } from 'class-validator';
import * as sanitizeHtml from 'sanitize-html';

export class ContactInfoDTO {
  @ApiProperty()
  @IsString()
  @Transform((params: TransformFnParams) => sanitizeHtml(params.value))
  public body: string;
}

Antwort #2

Zu Rezas Antwort hinzugefügt, dies ist eine aktuelle Version (kann aufgrund des Rufs nicht in den Kommentar gesetzt werden)

import { Transform } from 'class-transformer';
import { IsString } from 'class-validator';
import * as sanitizeHtml from 'sanitize-html';

// ...

@Transform((params: TransformFnParams) => sanitizeHtml(params.value))
field: string

Verwandte Artikel