Đi tới nội dung

Hệ thống & kiến trúc

Bảo mật ứng dụng web

Bắt đầu bằng threat modeling, rồi đi qua XSS và CSP, CORS và cross-origin isolation, OAuth/OIDC, JWT, OWASP API Top 10, SSRF và upload file, quản lý secret và chuỗi cung ứng npm — từng lớp phòng thủ cho một ứng dụng thật.

9 phần190 phút đọcCập nhật 31 thg 10, 2026

Các phần

  1. Phần 1

    Threat modeling cho team sản phẩm: STRIDE, sơ đồ luồng dữ liệu và ranh giới tin cậy, từ buổi họp 60 phút tới ticket

    Cách mình chạy threat modeling thực tế cho một team sản phẩm: bốn câu hỏi, vẽ DFD với trust boundary, đi STRIDE từng phần tử trên một hệ thống thật có SPA, API, Postgres, S3, webhook thanh toán và admin panel, chấm rủi ro đơn giản, biến threat thành ticket và giữ threat model sống trong repo.

    26 phút

  2. Phần 2

    Bảo mật frontend thực chiến: XSS trong React, CSP với nonce, Trusted Types, CSRF và clickjacking

    React escape giúp bạn rất nhiều, nhưng không phải tất cả. Bài này đi qua những lỗ hổng XSS vẫn lọt qua React, cách dựng CSP nghiêm ngặt bằng nonce trong Next.js, Trusted Types, CSRF thời SameSite, chuyện lưu token ở đâu và cách chặn clickjacking.

    17 phút

  3. Phần 3

    CORS và cross-origin isolation chuyên sâu: origin và site, preflight, credentials, CORP, COEP, COOP và Fetch Metadata

    Mô hình cross-origin của trình duyệt từ gốc: Same-Origin Policy chặn gì, CORS nới lỏng gì và không bao giờ bảo vệ gì, preflight và credentials, bug cache vì thiếu Vary: Origin, allowlist nguy hiểm, rồi CORP, COEP, COOP, Fetch Metadata và SameSite — kèm cấu hình NestJS và Next.js làm cho đúng.

    20 phút

  4. Phần 4

    OAuth 2.0 và OpenID Connect cho web app năm 2026: Authorization Code + PKCE, BFF và những lỗ hổng thật

    Đi từng request HTTP của luồng authorization code + PKCE, phân biệt state, nonce, ID token và access token, vì sao implicit flow đã chết, và cách dựng Backend-for-Frontend trong Next.js để token không bao giờ xuống trình duyệt — kèm refresh rotation, logout và các lỗ hổng mình gặp thật.

    21 phút

  5. Phần 5

    JWT chuyên sâu: những cái bẫy khi verify, các đòn tấn công kinh điển và xoay khoá với JWKS

    JWS khác JWE thế nào, những claim bắt buộc phải kiểm tra, alg: none, nhầm lẫn RS256/HS256, kid injection, lạm dụng jku — và cách pin thuật toán với jose, xoay khoá JWKS không làm ai bị logout, thu hồi token và test verifier bằng chính những token độc.

    20 phút

  6. Phần 6

    OWASP API Security Top 10 trong NestJS: code có lỗ hổng, code đã sửa, và những test giữ cho nó không quay lại

    Đi qua cả mười rủi ro của OWASP API Security Top 10 (2023) bằng NestJS: kiểm tra quyền sở hữu trong scoped repository, DTO whitelist, định hình response, policy kiểu CASL, rate limit theo chi phí, business flow idempotent, fetch chống SSRF và ma trận phân quyền trong e2e test.

    20 phút

  7. Phần 7

    SSRF và bảo mật upload file: fetch URL và upload sao cho không giao chìa khoá mạng nội bộ

    Link preview, webhook, import ảnh từ URL và upload file trông như tính năng nhàm chán, nhưng cứ xuất hiện trong báo cáo sự cố. Vì sao blocklist SSRF thất bại, fetch an toàn trong Node với undici và pin IP, IMDSv2, và pipeline upload: presigned S3, magic bytes, sharp, domain riêng, quét bất đồng bộ.

    22 phút

  8. Phần 8

    Quản lý secret cho team nhỏ: từ file .env đến GitHub Actions OIDC và credential ngắn hạn

    Thế nào là secret, file .env và token CI dài hạn thực sự bị lộ ra sao, làm gì trong giờ đầu tiên sau khi lộ, so sánh các kho secret, GitHub Actions OIDC sang AWS và GCP thay cho key tĩnh, xoay vòng secret không downtime, và validate env có kiểu trong monorepo Turborepo.

    23 phút

  9. Phần 9

    Tấn công chuỗi cung ứng npm sau Shai-Hulud: điều gì đã thay đổi và cách gia cố một monorepo JavaScript

    Từ Nx s1ngularity, chalk/debug đến Shai-Hulud, TanStack và ChainDrop: các vụ tấn công npm thực sự đã làm gì, npm và GitHub đã thay đổi những gì, và một hệ phòng thủ nhiều lớp — install, CI, publish — áp dụng thẳng vào một monorepo Bun + Turborepo.

    21 phút

Ôn tập cả chuỗi

Đã trả lời 0/18 · đúng 0

18 câu rút từ các phần của chuỗi. Trả lời ở đây cũng được tính cho quiz của từng bài.

  1. Câu 1/18Cơ bảnĐiểm khác biệt chính giữa threat modeling và pentest là gì?
  2. Câu 2/18Trung cấpMột worker chạy trong VPC của công ty, xử lý file mà người dùng ngoài upload lên S3. Nhóm cho rằng worker "nằm trong mạng nội bộ nên an toàn". Nhận định nào đúng?
  3. Câu 3/18Trung cấpReact escape mọi giá trị render dưới dạng text. Vì sao XSS vẫn còn là rủi ro trong ứng dụng React?
  4. Câu 4/18Nâng caoVì sao bài khuyến nghị strict CSP dựa trên nonce kèm 'strict-dynamic' thay vì allow-list theo domain?
  5. Câu 5/18Trung cấpMột đồng nghiệp nói "API đã cấu hình CORS chặt nên không cần lo CSRF". Vì sao nhận định này sai?
  6. Câu 6/18Trung cấpVì sao việc đặt Access-Control-Allow-Origin bằng đúng Origin của request kèm Allow-Credentials: true là một lỗ hổng?
  7. Câu 7/18Trung cấpVì sao RFC 9700 khuyến nghị dùng PKCE cho mọi client, kể cả confidential client đã có client_secret?
  8. Câu 8/18Trung cấpMột SPA gửi ID token trong header Authorization để gọi API và API chấp nhận vì chữ ký hợp lệ. Vấn đề lớn nhất là gì?
  9. Câu 9/18Nâng caoServer phát token bằng RS256 và verify bằng một hàm lấy thuật toán từ header. Kẻ tấn công làm gì để giả mạo token mà không cần private key?
  10. Câu 10/18Nâng caoKhi xoay khoá JWKS định kỳ, vì sao phải publish khoá mới vào JWKS và chờ một khoảng trước khi bắt đầu ký bằng nó?
  11. Câu 11/18Trung cấpEndpoint GET /orders/:id đã có câu if so order.customerId với user hiện tại. Vì sao bài vẫn khuyên đưa kiểm tra quyền sở hữu vào tầng dữ liệu (scoped repository)?
  12. Câu 12/18Nâng caoTính năng "nhập từ URL" cho phép server fetch URL do người dùng cung cấp. Cách chặn SSRF nào đáng tin nhất trong số này?
  13. Câu 13/18Nâng caoCode resolve hostname, kiểm tra IP là public, rồi gọi fetch(url). Vì sao vẫn có thể bị SSRF, và cách sửa đúng là gì?
  14. Câu 14/18Trung cấpTeam phục vụ file upload của người dùng từ files.acme.com trong khi app chạy ở app.acme.com, và cho rằng như vậy đã cô lập. Điều gì sai?
  15. Câu 15/18Trung cấpMột dev lỡ push API key lên repo. Sau khi đã xoá file và force-push viết lại lịch sử, họ coi như xong việc. Bước nào bị thiếu và vì sao nó quan trọng nhất?
  16. Câu 16/18Trung cấpVì sao dùng GitHub Actions OIDC để deploy lên cloud tốt hơn lưu AWS_SECRET_ACCESS_KEY trong GitHub secrets?
  17. Câu 17/18Nâng caoMột bản phát hành mới của package có provenance hợp lệ. Có thể kết luận gì?
  18. Câu 18/18Trung cấpVì sao áp dụng cooldown (từ chối phiên bản mới hơn vài ngày) được xem là biện pháp có chi phí trên hiệu quả tốt?

Chuỗi khác

Chuỗi bài