Để bắt đầu với nền, bài đăng này là những gì Jeff Atwood nói về mã thông báo CSRF. Trong chính trang này, anh tiếp tục nói:
Một phương pháp phòng ngừa thậm chí còn mạnh mẽ hơn, phức tạp hơn là tận dụng trạng thái máy chủ - để tạo (và theo dõi, hết thời gian) một khóa ngẫu nhiên duy nhất cho mỗi MẪU HTML duy nhất bạn gửi xuống máy khách. Chúng tôi sử dụng một biến thể của phương pháp này trên Stack Overflow rất thành công.
Nhưng trong bài đăng này, Jeff không bao giờ nhận xét về thời điểm và cách thức các mã thông báo nên được cập nhật.
Tôi đã sử dụng một kỹ thuật tương tự trong một ứng dụng web mà tôi đang làm việc. Nó hoạt động như thế này:
- Bất cứ khi nào người dùng sẽ
POST
dữ liệu đến máy chủ của tôi, mã thông báo csrf sẽ được gửi cùng. - Mã thông báo CSRF này được lưu trữ trong cookie mạnh về mật mã trong phiên của người dùng.
- Nếu mã thông báo hợp lệ, yêu cầu của người dùng được xử lý và ngược lại.
- Nếu yêu cầu hợp lệ, hãy loại bỏ mã thông báo cũ ở phía máy chủ và tạo mã thông báo mới. Phản hồi từ máy chủ chứa mã thông báo csrf mới sẽ được sử dụng trong yêu cầu tiếp theo. Mã thông báo cũ trên tất cả các biểu mẫu trên một trang được cập nhật với biểu mẫu mới để yêu cầu tiếp theo được xử lý đúng cách.
Có phải là khôn ngoan để cập nhật mã thông báo sau khi POST
yêu cầu hoặc chỉ nên thực hiện cập nhật bất cứ khi nào người dùng đưa ra GET
yêu cầu và giữ cùng mã thông báo cho đến khi yêu cầu GET tiếp theo được thực hiện?