CSRF lợi dụng việc browser tự động đính kèm cookie khi gửi request đến một domain — attacker đặt form/img trên evil.com trỏ đến bank.com, request mang theo session cookie của nạn nhân.
- Ví dụ —
<img src='https://bank.com/transfer?to=attacker&amount=1000'>: nếu user đang đăng nhập và bank không có CSRF protection, lệnh chuyển tiền được thực thi. - SameSite cookie — defense chính hiện nay:
Strictkhông gửi cookie trong mọi cross-site request (kể cả click link từ email);Lax(default Chrome từ 2020) chỉ gửi trong top-level GET navigation, không gửi trong POST/iframe/img — đủ cho đa số case;Nonegửi trong mọi cross-site request, bắt buộc kèmSecure. - CSRF token — token ngẫu nhiên lưu trong session, nhúng vào hidden field và verify server-side; attacker không đọc được token vì same-origin policy chặn đọc response cross-origin.
- Double submit cookie — gửi token trong cả cookie lẫn body/header, server so khớp hai giá trị — không cần server-side state.
- Custom header (AJAX) — request cross-origin kèm custom header (
X-Requested-With,Content-Type: application/json) kích hoạt CORS preflight; server không cho phép thì browser không bao giờ gửi request thật — attacker vẫn dựng được request nhưng nó không được gửi đi. - Kiểm tra Origin header — hữu ích nhưng không đủ một mình: browser không cho attacker giả mạo Origin, vấn đề thực tế là header có thể vắng mặt (một số request/proxy lược bỏ nó).