[NestJS] Data Validation With Pipe [PART1]

Image placeholder
แวะมาทักทายกันได้

เปิดบทความด้วยคำถามที่ว่า ทำไมต้องทำ Data Validation“

 

เทคนิค การโจมตีแบบ Injection Attacks ยังคงเป็นการโจมตีเว็บไซต์ที่ติดอันดับ Top10 ของ OWASP ทำให้การตรวจสอบข้อมูลที่วิ่งเข้ามาในระบบ มีความสำคัญอย่างมากในด้าน security

 

ถ้าข้อมูลในระบบหรือแอปพลิเคชันของคุณนั้น ไม่ได้สำคัญและคุณก็ไม่ได้สนใจว่าต้องปลอดภัย เดาว่าส่วนใหญ่ระบบพวกนั้นคงจะเป็น Toy Project แต่สำหรับโลกแห่งความเป็นจริงนั้น data ที่เป็นเรื่องที่สำคัญมากๆ จำเป็นจะต้องถูกป้องกันและปกป้องภายใต้ระบบที่มีความปลอดภัยและน่าเชื่อถือเพราะ การเกิดข้อผิดพลาดเพียงเล็กน้อยก็อาจทำให้เกิดความเสียหายได้ ดังนั้น การทำ Data Validation นั้นจึงสำคัญ

 

การ validation หรือการป้องกันเป็นหนึ่งวิธีที่จะป้องกันการโจมตี Injection attack ได้

 

การป้องกันข้อมูลเข้ามาในระบบจะต้องตรวจสอบให้แน่ใจว่า

 

1.     Data มีความครบถ้วน

2.     Data ถูกต้องตามรูปแบบที่กำหนด

3.     Data ถูกต้องการมุมมองตามความต้องการ

4.     Data ถูกต้องตามวัตถุประสงค์การใช้งาน

 

Nestjs ได้เตรียมวิธีการทำ Data validation เอาไว้หลายแบบ โดยการเรียกใช้ Pipe operator ที่เป็น Build-in ได้และนอกจากนี้ ยังสามารถ Custom Pipe วิธีการ Validation แบบที่ทำขึ้นเองได้ เช่น Object Schema validation ด้วย Joi library หรือการทำ class-validator เป็นต้น


Build-in Pipe




จากตัวอย่าง เป็นการเรียกใช้งาน ParseIntPipe ที่จะใช้ร่วมกับ Method getTaskById ซึ่งได้รับ Param ชื่อ id เข้ามาใน API ก่อนที่ Method getTaskById จะถูกเรียก Pipe จะ Validate Parameter ชื่อ id ก่อนว่าเป็น Integer หรือไม่

 

ลองมาดูตัวอย่างกัน

 

กรณีที่ไม่ได้ใส่ ParseIntPipe เมื่อใส่ Param id มาเป็นตัวเลข และ ตัวอักษร จากภาพที่แสดงทั้ง ภาพ จะได้ HTTP_CODE 200 Return


ส่งค่า param เป็นตัวเลข localhost:3000/tasks/1




ส่งค่า param เป็นตัวอักษร ซึ่งแน่นอนว่าแบบนี้ผิด localhost:3000/tasks/d 





มาลองดูหลังจากที่ทำ Pipe กันจาก code ด้านบนที่ผ่านมา 

หลังจากที่ใส่ ParseIntPipe เข้ามาตามตัวอย่างด้านบนก็ได้ error HTTP_CODE 400 Bad Request




นี้คือผลลัพท์ เมื่อใส่ค่าเข้ามาไม่ถูกต้องตามที่กำหนด


คราวนี้ลองมาดูตัวอย่างการ Custom Pipe ของ Build-In กันบ้าง จาก code ตัวอย่างด้านล่างนี้ เผื่อว่าอาจจะต้องแก้ตามที่เราต้องการ




มาลองทดสอบกันดู ได้ HTTP_CODE 406 Not Acceptable ตามที่ Custom ที่ HttpStatus ใน code




และแน่นอนว่า สามารถสร้าง validation pipe เป็นของตัวเองได้ด้วย โดยการเพิ่ม pipe annotation เข้าไป ชื่อmethod คือ UsePipe() decorator

 

สมมติว่าจะส่งข้อมูลเข้ามาในระบบด้วย POST สัก API หนึ่งโดยให้ชื่อว่า createTask หน้าตาก็จะเป็นดัง code ด้านล่าง

 




จาก code ด้านบน JoiValidationPipe เป็น class ที่ต้องสร้างขึ้นเองไม่ใช่ Build-in pipe ที่จะใช้ร่วมกับ Schema-based ด้วย Joi library

 

Note : Joi เป็น library สำหรับจัดการการทำ schema ของ javascript

 

ให้สร้างไฟล์ใหม่ขึ้นมา 1 ไฟล์ที่ src หรือตรงไหนก็ได้ใน project แล้วตั้งชื่อว่า validation-pipe.ts

 

ก่อนจะ code ก็ให้ติดตั้ง package ของ joi ด้วยคำสั่ง






อ่านต่อ [Part 2] [NestJS] Data Validation With Pipe [PART2]

แวะมาทักทายกันได้
donate

Categories: Tutorial Tags: #nestjs , 2115