Menu

Thursday, January 21, 2021

[NodeJS - NestJS] ข้อควรระวัง: Class transformer ไม่ตัด properties ส่วนเกินออกจาก Object ปลายทาง
[NodeJS - NestJS] Caution: Class transformer not stripping additional properties

Class transformer เป็นส่วนประกอบนึงของ NestJS ที่ใช้ในการแปลง JSON object ใดๆเป็น class instance ที่เราต้องการ และยังถูกใช้ในการแปลง request ที่ส่งเข้ามาให้เป็น class ที่เราต้องการโดยอัตโนมัติอีกด้วย

สมมติว่า เรามี function ใน controller ดังนี้
@Post()
async createRole (@Body() req: CreateRoleReqDto): Promise <Role> {
    let role = await this.roleService.createRole(req);
    return role;
}
และ class CreateRoleReqDto สำหรับ request ของเราเป็นดังนี้
export class CreateRoleReqDto{
    name: string;
    description?: string;
    permissionIds?: number[];
}
เมื่อเราส่ง request body ดังนี้
{
    "name":"test3",
    "description":"def",    
    "permissionIds": [1,2]
}
request body ของเราจะถูกแปลงเป็น instance ของ CreateRoleReqDto โดยอัตโนมัติ 

อย่างไรก็ตาม Class transformer ยังมีจุดอ่อนที่สำคัญและกระทบถึงความปลอดภัยของระบบได้ 

นั่นคือ การแปลงค่าของ class transformer จะแปลง JSON object ทั้งก้อนไปเป็น class instance ของเราเลย โดยไม่สนใจว่า property นั้นถูกกำหนดไว้ใน class หรือไม่ 

สมมติว่า เราส่ง request body เป็นดังนี้
{
    "name":"test3",
    "description":"def",
    "created_date": "2020-01-01 12:00:00",
    "permissionIds": [1,2]
}
ตัวแปร req ของเราที่เป็น instance ของ CreateRoleReqDto ก็จะมีหน้าตาแบบเดียวกับ request body นี้ 

ความเสี่ยงที่อาจเกิดขึ้น คือ ถ้า property ที่ถูกส่งเข้ามาเกินนั้น มีชื่อตรงกับ field ในฐานข้อมูล field นั้นจะถูกบันทึกค่าไปด้วย โดยที่เราไม่ได้ตั้งใจ

สำหรับข้อมูลเพิ่มเติม อ่านได้ที่ https://github.com/typestack/routing-controllers/issues/200

No comments:

Post a Comment