☰ Mục lục series
Tài liệu NestJS tiếng Việt
  1. Nhập môn (Overview)
    1. Giới thiệu
    2. First steps
    3. Controllers
    4. Providers
    5. Modules
    6. Middleware
    7. Exception filters
    8. Pipes
    9. Guards
    10. Interceptors
    11. Custom decorators
  2. Nền tảng (Fundamentals)
    1. Custom providers
    2. Asynchronous providers
    3. Dynamic modules
    4. Injection scopes
    5. Circular dependency
    6. Module reference
    7. Lazy-loading modules
    8. Execution context
    9. Lifecycle events
    10. Discovery service
    11. Platform agnosticism
    12. Testing
  3. Kỹ thuật (Techniques)
    1. Configuration
    2. Database (SQL)
    3. MongoDB
    4. Validation
    5. Caching
    6. Serialization
    7. Versioning
    8. Task scheduling
    9. Queues
    10. Logging
    11. Cookies
    12. Events
    13. Compression
    14. File upload
    15. Streaming files
    16. HTTP module
    17. Session
    18. MVC
    19. Performance (Fastify)
    20. Server-Sent Events
  4. Bảo mật (Security)
    1. Authentication
    2. Authorization
    3. Encryption & Hashing
    4. Helmet
    5. CORS
    6. CSRF
    7. Rate limiting
    8. Vòng đời request
  5. OpenAPI (Swagger)
    1. Introduction
    2. Types and parameters
    3. Operations
    4. Security
    5. Mapped types
    6. Decorators
    7. CLI plugin
    8. Other features
  6. Recipes
    1. REPL
    2. CRUD generator
    3. SWC (fast compiler)
    4. Passport (auth)
    5. Hot reload
    6. MikroORM
    7. Router module
    8. Health checks (Terminus)
    9. CQRS
    10. Prisma
    11. Serve static
    12. Commander
    13. Async local storage
  7. WebSockets
    1. Gateways
    2. Exception filters
    3. Pipes
    4. Guards
    5. Interceptors
    6. Adapters
  8. Microservices
    1. Overview
    2. Redis
    3. MQTT
    4. NATS
    5. RabbitMQ
    6. Kafka
    7. gRPC
    8. Custom transporters
    9. Exception filters
    10. Pipes
    11. Pre-request hooks
    12. Guards
    13. Interceptors
  9. GraphQL
    1. Quick start
    2. Resolvers
    3. Mutations
    4. Subscriptions
    5. Scalars
    6. Directives
    7. Interfaces
    8. Unions and enums
    9. Field middleware
    10. Mapped types
    11. Plugins
    12. Complexity
    13. Extensions
    14. CLI plugin
    15. Generating SDL
    16. Sharing models
    17. Other features
    18. Federation
  10. CLI & triển khai
    1. CLI overview
    2. Workspaces
    3. Libraries
    4. Usage
    5. Scripts
    6. Deployment
    7. Standalone apps
  11. FAQ
    1. Serverless
    2. HTTP adapter
    3. Keep-Alive connections
    4. Global path prefix
    5. Raw body
    6. Hybrid application
    7. HTTPS & multiple servers
    8. Common errors
  12. Phụ lục
    1. Bảng thuật ngữ
Bảo mật (Security)

CSRF Protection (Chống CSRF)

Bản dịch từ docs.nestjs.com/security/csrf

Cross-site request forgery (CSRF hay XSRF — giả mạo request giữa các site) là một dạng tấn công mà các lệnh không được cho phép được gửi đi từ một user đáng tin cậy tới một web application. Để giúp ngăn chặn điều này, bạn có thể dùng package csrf-csrf.

Dùng với Express (mặc định)

Bắt đầu bằng việc cài package cần thiết:

$ npm i csrf-csrf

Cảnh báo Như đã ghi chú trong tài liệu của csrf-csrf, middleware này yêu cầu session middleware hoặc cookie-parser phải được khởi tạo trước đó. Vui lòng xem tài liệu để biết thêm chi tiết.

Sau khi cài xong, đăng ký middleware csrf-csrf như một global middleware.

import { doubleCsrf } from 'csrf-csrf';
// ...
// somewhere in your initialization file
const {
  invalidCsrfTokenError, // This is provided purely for convenience if you plan on creating your own middleware.
  generateToken, // Use this in your routes to generate and provide a CSRF hash, along with a token cookie and token.
  validateRequest, // Also a convenience if you plan on making your own middleware.
  doubleCsrfProtection, // This is the default CSRF protection middleware.
} = doubleCsrf(doubleCsrfOptions);
app.use(doubleCsrfProtection);

Dùng với Fastify

Bắt đầu bằng việc cài package cần thiết:

$ npm i --save @fastify/csrf-protection

Sau khi cài xong, đăng ký plugin @fastify/csrf-protection như sau:

import fastifyCsrf from '@fastify/csrf-protection';
// ...
// somewhere in your initialization file after registering some storage plugin
await app.register(fastifyCsrf);

Cảnh báo Như đã giải thích trong tài liệu của @fastify/csrf-protection tại đây, plugin này yêu cầu một storage plugin (plugin lưu trữ) phải được khởi tạo trước. Vui lòng xem tài liệu đó để biết thêm hướng dẫn.

Ghi chú người dịch Cơ chế “double submit cookie” mà csrf-csrf dùng hoạt động bằng cách so khớp token nằm trong cookie với token client gửi kèm request (qua header hoặc form field) — server không cần lưu token. Laravel (@csrf) và Rails (authenticity_token) mặc định dùng kiểu khác: token lưu trong session phía server rồi so với token trong form. Mục tiêu giống nhau (chặn request giả mạo từ site khác), chỉ khác nơi lưu token. Điểm dễ gây lỗi khi vibe-code: middleware này không thay thế session/cookie-parser, nó cần chạy sau middleware đó trong chuỗi xử lý, nếu không sẽ báo lỗi thiếu cookie ngay cả khi bạn đã cấu hình đúng.

Nội dung gốc: NestJS Documentation © Kamil Myśliwiec, giấy phép MIT. Bản dịch và ghi chú: Lê Văn Dũng.