Tôi đang cố gắng hiểu toàn bộ vấn đề với CSRF và các cách thích hợp để ngăn chặn vấn đề này. (Tài nguyên tôi đã đọc, hiểu và đồng ý với: Bảng kiểm tra phòng chống CSRF của OWASP , Câu hỏi về CSRF .)
Theo tôi hiểu, lỗ hổng xung quanh CSRF được đưa ra bởi giả định rằng (theo quan điểm của máy chủ web) cookie phiên hợp lệ trong yêu cầu HTTP đến phản ánh mong muốn của người dùng được xác thực. Nhưng tất cả các cookie cho miền gốc được trình duyệt đính kèm theo yêu cầu của trình duyệt, vì vậy tất cả các máy chủ có thể suy ra sự hiện diện của cookie phiên hợp lệ trong yêu cầu là yêu cầu đến từ trình duyệt có phiên xác thực; nó không thể tiếp tục thừa nhận bất cứ điều gì về mãchạy trong trình duyệt đó, hoặc liệu nó thực sự phản ánh mong muốn của người dùng. Cách để ngăn chặn điều này là bao gồm thông tin xác thực bổ sung ("mã thông báo CSRF") trong yêu cầu, được thực hiện bằng một số phương tiện khác ngoài xử lý cookie tự động của trình duyệt. Nói một cách lỏng lẻo, sau đó, cookie phiên xác thực người dùng / trình duyệt và mã thông báo CSRF xác thực mã đang chạy trong trình duyệt.
Vì vậy, tóm lại, nếu bạn đang sử dụng cookie phiên để xác thực người dùng ứng dụng web của mình, bạn cũng nên thêm mã thông báo CSRF cho mỗi phản hồi và yêu cầu mã thông báo CSRF phù hợp trong mỗi yêu cầu (đột biến). Mã thông báo CSRF sau đó thực hiện quay vòng từ máy chủ sang trình duyệt trở lại máy chủ, chứng minh cho máy chủ rằng trang thực hiện yêu cầu được chấp thuận bởi (được tạo bởi, thậm chí) máy chủ đó.
Đối với câu hỏi của tôi, đó là về phương thức vận chuyển cụ thể được sử dụng cho mã thông báo CSRF đó trên vòng tròn đó.
Nó có vẻ phổ biến (ví dụ như trong AngularJS , Django , Rails ) để gửi mã thông báo CSRF từ máy chủ đến máy khách dưới dạng cookie (ví dụ: trong tiêu đề Set-Cookie), sau đó có Javascript trong ứng dụng khách loại bỏ nó ra khỏi cookie và đính kèm nó dưới dạng một tiêu đề XSRF-TOKEN riêng biệt để gửi lại cho máy chủ.
(Một phương thức thay thế là một phương pháp được đề xuất bởi vd Express , trong đó mã thông báo CSRF do máy chủ tạo ra được đưa vào phần thân phản hồi thông qua mở rộng mẫu phía máy chủ, được gắn trực tiếp vào mã / đánh dấu sẽ cung cấp lại cho máy chủ, ví dụ: như một đầu vào dạng ẩn. Ví dụ đó là một cách thức hoạt động trên web 1.0, nhưng sẽ khái quát hóa tốt cho một máy khách nặng hơn JS.)
Tại sao nó lại phổ biến để sử dụng Set-Cookie làm phương tiện vận chuyển xuôi dòng cho mã thông báo CSRF / tại sao đây là một ý tưởng tốt? Tôi tưởng tượng các tác giả của tất cả các khung này đã cân nhắc các lựa chọn của họ một cách cẩn thận và đã không hiểu sai điều này. Nhưng thoạt nhìn, việc sử dụng cookie để khắc phục những gì về cơ bản giới hạn thiết kế trên cookie dường như rất tệ. Trên thực tế, nếu bạn đã sử dụng cookie làm vận chuyển khứ hồi (Set-Cookie: xuôi dòng cho máy chủ để thông báo cho trình duyệt mã thông báo CSRF và Cookie: tiêu đề ngược dòng để trình duyệt trả lại cho máy chủ), bạn sẽ giới thiệu lại lỗ hổng cho bạn đang cố gắng sửa chữa.
Tôi nhận ra rằng các khung ở trên không sử dụng cookie cho toàn bộ roundtrip cho mã thông báo CSRF; họ sử dụng Set-Cookie xuôi dòng, sau đó một cái gì đó khác (ví dụ như tiêu đề X-CSRF-Token) ngược dòng và điều này sẽ loại bỏ lỗ hổng. Nhưng ngay cả khi sử dụng Set-Cookie khi vận chuyển xuôi dòng có khả năng gây hiểu lầm và nguy hiểm; giờ đây trình duyệt sẽ đính kèm mã thông báo CSRF cho mọi yêu cầu bao gồm các yêu cầu XSRF độc hại chính hãng; tốt nhất là làm cho yêu cầu lớn hơn yêu cầu và tệ nhất là một đoạn mã máy chủ có ý nghĩa tốt nhưng sai lầm thực sự có thể cố gắng sử dụng nó, điều này thực sự tồi tệ. Và hơn nữa, vì người nhận dự định thực sự của mã thông báo CSRF là Javascript phía máy khách, điều đó có nghĩa là cookie này không thể được bảo vệ chỉ bằng http.