繁体   English   中英

如何正确清理 NestJS 输入?

[英]How to Properly Sanitize NestJS Input?

我问这个是因为我似乎无法得到一个直接的答案。

因此,NestJS 有一种非常优雅的方式来使用装饰器来处理验证。 也就是说,您可以使用您期望的属性定义 DTO 类,并使用类验证器装饰器对它们进行注释。 例如,假设我们有一个接受来自联系表单的输入的路由。

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

     @IsString()
     @IsNotEmpty()
     body: string

}

这非常适合验证。 如果我输入无效的电子邮件,它会按预期拒绝。 但是,这是我的问题。 输入消毒怎么样? 比如说,我在 body 参数中输入了一些 JavaScript? 比如说,我的身体看起来像这样:

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

现在,这仍然被接受。 即使脚本标签没有转换为 HTML 实体,这确实会带来一些安全风险。

所以,我的问题是 NestJS 是否有任何内置的消毒机制? 是否有关于此的适当文件? 因为我真的找不到任何东西,尽管这种东西在 Web 开发的上下文中非常重要。

在 NestJS 中进行输入清理的最佳实践是什么?

您可以使用 class-sanitizer并将其装饰器应用于模型的属性:

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

     @IsString()
     @IsNotEmpty()
     @Escape()
     body: string

}

像这样将sanitize-htmlTransform一起使用:

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

export class DocumentDto {
  @ApiProperty()
  @IsString()
  @Transform((value: string) => sanitizeHtml(value))
  public content: string;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM