【问题标题】:How to Properly Sanitize NestJS Input?如何正确清理 NestJS 输入?
【发布时间】:2021-01-26 12:05:43
【问题描述】:

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

因此,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 中进行输入清理的最佳做法是什么?

【问题讨论】:

    标签: javascript node.js typescript nestjs


    【解决方案1】:

    像这样使用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;
    }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 好的。虽然,在它的存储库上,它说它已经折旧并改用 class-validate 和 class-transformer。有没有办法用 class-validate 和 class-transformer 进行消毒?
      • 确保您可以创建自定义清理作为自定义装饰器(如果不存在)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-12
      • 1970-01-01
      • 2015-01-25
      • 2021-11-24
      • 1970-01-01
      相关资源
      最近更新 更多