Skip to content

CSRF và thuộc tính SameSite của cookie ​

Cross-Site Request Forgery (CSRF) là kiểu tấn công lợi dụng việc trình duyệt tự động đính kèm cookie vào mọi request gửi tới một domain, kể cả khi request đó được khởi tạo từ một trang web khác. Ví dụ: người dùng đang đăng nhập ngân hàng A (có cookie session), sau đó ghé một trang web độc hại B — trang B âm thầm gửi một form POST tới ngân hàng A (ví dụ yêu cầu chuyển khoản); trình duyệt vẫn tự động đính kèm cookie session của A vào request đó, khiến ngân hàng A tưởng chính chủ tài khoản đang thao tác.

Thuộc tính SameSite trên cookie được sinh ra để hạn chế đúng kiểu tấn công này, có ba giá trị:

Giá trịHành viĐánh đổi
StrictKhông bao giờ gửi cookie trong request xuất phát từ domain khácAn toàn nhất, nhưng có thể phá vỡ trải nghiệm — ví dụ bấm link từ email dẫn tới trang web, cookie không được gửi, hệ thống coi như chưa đăng nhập
LaxGửi cookie khi điều hướng cấp cao nhất bằng phương thức an toàn (chủ yếu là click link, GET), nhưng không gửi với request nền (ảnh, iframe) hay submit form POST từ domain khácCân bằng — đây là giá trị mặc định của trình duyệt (Chrome áp dụng Lax mặc định từ 2021 nếu server không khai báo)
NoneTắt hẳn giới hạn SameSite, cookie luôn được gửi dù cross-siteBắt buộc phải đi kèm Secure (chỉ hoạt động qua HTTPS); chỉ dùng khi thực sự cần cookie hoạt động cross-site (ví dụ widget nhúng từ domain khác)

Giới hạn cần biết: SameSite=Lax không bảo vệ tuyệt đối — request POST từ chính các subdomain của cùng hệ thống vẫn được coi là "same-site" và cookie vẫn được gửi kèm, nên nếu một subdomain bị dính lỗ hổng XSS, domain chính vẫn có thể bị ảnh hưởng gián tiếp. Vì vậy khuyến nghị thực tế là kết hợp SameSite=Strict/Lax cùng với CSRF token riêng cho các request thay đổi trạng thái (POST/PUT/DELETE), không dựa hoàn toàn vào một cơ chế duy nhất.