Hiểu đúng về CSRF và cách phòng chống hiệu quả
Ngày 25 tháng 3, 2026
CSRF (Cross-Site Request Forgery) là kiểu tấn công lừa trình duyệt của user đang đăng nhập gửi request thay đổi trạng thái tới hệ thống mà user không chủ đích thực hiện.
Khác XSS, attacker không nhất thiết phải chạy script trong origin của bạn. Họ lợi dụng việc browser tự động đính kèm cookie phiên.
1. Luồng CSRF điển hình
Một kịch bản thường gặp:
- User đang đăng nhập vào ứng dụng mục tiêu.
- Attacker tạo trang/link độc hại.
- User truy cập trang độc hại khi phiên đăng nhập còn hiệu lực.
- Browser gửi request sang ứng dụng mục tiêu kèm cookie phiên.
- Server xử lý request nếu không có cơ chế chống CSRF.
Từ góc nhìn backend, request trông rất giống hành vi hợp lệ của user thật.
Đi sâu hơn: vì sao browser khiến CSRF khả thi
Gốc vấn đề là "ambient authority": browser tự gắn cookie phiên vào request. Nếu server chỉ dựa vào cookie để kết luận request hợp lệ mà không verify ý định người dùng, attacker có thể lợi dụng điều này để tạo side effect trái phép.
Nói ngắn gọn: có xác thực, nhưng không có bằng chứng về chủ đích hành động.
CSRF ATTACK FLOW
2. Vì sao CSRF nguy hiểm
- Khai thác trực tiếp phiên đã xác thực.
- Nạn nhân thường không biết hành động đã diễn ra.
- Log có thể vẫn hiển thị user/session hợp lệ, gây khó điều tra.
Tác động thường gặp: đổi email, đổi mật khẩu, chỉnh quyền, tạo giao dịch trái phép.
Trong vận hành thực tế, CSRF nguy hiểm vì thường chạy âm thầm, khó phân biệt với traffic thật nếu telemetry không được thiết kế tốt.
3. Cơ chế phòng thủ chính: anti-CSRF token
Với các endpoint thay đổi trạng thái, yêu cầu token chống CSRF và verify ở server.
Pattern cơ bản:
- Server phát token theo session hoặc theo request.
- Client gửi token qua hidden field hoặc custom header.
- Server so khớp token trước khi xử lý mutation.
- Thiếu/sai token thì reject (
403).
Token nên:
- khó đoán,
- có vòng đời ngắn khi phù hợp,
- rotate/scope theo mức độ nhạy cảm của action.
Chi tiết triển khai dễ bị bỏ sót
CSRF token phải được kiểm tra ở mọi endpoint mutation, kể cả route cũ ít dùng hoặc panel nội bộ. Một endpoint thiếu kiểm tra có thể phá hỏng toàn bộ lớp phòng thủ.
CSRF TOKEN VALIDATION
4. SameSite cookie là lớp bảo vệ rất quan trọng
Cấu hình cookie đúng cách:
SameSite=Laxthường là default tốt cho nhiều app.SameSite=Strictan toàn hơn nhưng có thể ảnh hưởng UX một số flow.SameSite=Nonechỉ dùng khi thật sự cần cross-site và phải đi cùngSecure.
Đồng thời luôn dùng:
Securecho HTTPS,HttpOnlycho cookie phiên.
SameSite giúp giảm đáng kể khả năng cookie bị gửi trong bối cảnh cross-site.
Chọn SameSite theo ngữ cảnh sản phẩm
Lax: cân bằng tốt cho đa số ứng dụng.Strict: mạnh hơn nhưng có thể ảnh hưởng flow điều hướng từ ngoài vào.None: chỉ dùng khi thật sự cần cross-site và luôn đi kèmSecure.
SameSite là lớp quan trọng, nhưng không thay thế hoàn toàn CSRF token.
CSRF COOKIE + POLICY SHIELD
5. Kỷ luật HTTP method
Không dùng GET cho hành động thay đổi dữ liệu.
Lý do:
GETdễ bị kích hoạt qua link hoặc thẻ nhúng.- URL
GETcó thể vào history/cache/share. GETnên giữ semantic idempotent.
Dùng POST/PUT/PATCH/DELETE cho mutation và bắt buộc verify CSRF ở các route này.
Việc tuân thủ đúng semantic method cũng giúp hệ thống dễ quan sát, dễ review và dễ điều tra hơn khi có sự cố.
6. Bổ sung lớp kiểm tra phía server
Defense-in-depth thường gồm:
- kiểm tra
Originvà/hoặcRefererkhi phù hợp, - phát hiện mẫu mutation bất thường từ nguồn cross-site,
- cấu hình CORS chặt chẽ cho API,
- step-up auth cho hành động rủi ro cao.
Không có một kỹ thuật đơn lẻ đủ an toàn cho mọi kiến trúc.
Hardening theo mức rủi ro
Với hành động nhạy cảm cao (đổi email, reset 2FA, thay đổi thông tin thanh toán):
- yêu cầu re-auth hoặc step-up verification,
- bổ sung token chống replay,
- giám sát bất thường theo origin/user-agent,
- log event bảo mật có cấu trúc để điều tra nhanh.
7. Pattern triển khai thực tế với Next.js
Với ứng dụng auth theo cookie:
- phát CSRF token khi bootstrap session/form,
- gửi token bằng custom header ở mutation request,
- verify token tại API route hoặc server action,
- reject mismatch và log security event,
- kết hợp cùng chiến lược SameSite cookie.
Nếu API dùng Bearer token qua Authorization header (không dựa vào cookie tự động), rủi ro CSRF thường thấp hơn nhưng vẫn phải threat-model rõ ràng.
Nếu hệ thống chạy song song cookie auth và bearer auth, cần document rõ boundary. Kiến trúc mixed-mode là nơi assumptions về CSRF dễ sai nhất.
8. Checklist nhanh
- Tuyệt đối không mutate state bằng
GET. - Bắt buộc CSRF token cho toàn bộ endpoint mutation.
- Cấu hình
SameSite,Secure,HttpOnlyđúng chuẩn. - Verify
Origin/Refererkhi khả thi. - Siết chặt hơn cho flow rủi ro cao.
- Theo dõi spike request bất thường và CSRF validation fail.
9. Kết luận
CSRF là bài toán nhầm lẫn niềm tin: server tin vào cookie mà browser tự gửi.
Muốn chặn hiệu quả cần kết hợp nhiều lớp:
- CSRF token,
- cookie attributes chuẩn,
- kỷ luật HTTP method,
- kiểm tra server-side bổ sung.
Khi làm đúng theo lớp phòng thủ, CSRF sẽ từ rủi ro ngầm thành vùng kiểm soát bảo mật rõ ràng.
Mục tiêu thực tế không phải "thêm một tính năng chống CSRF", mà là thiết kế nhiều lớp sao cho mỗi lớp đều làm giảm xác suất tấn công thành công.