Django đi kèm với CSRF protection middleware, tạo mã thông báo mỗi phiên duy nhất để sử dụng trong biểu mẫu. Nó quét tất cả các yêu cầu đến POST
mã thông báo chính xác và từ chối yêu cầu nếu mã thông báo bị thiếu hoặc không hợp lệ.Việc hiển thị mã thông báo bảo vệ CSRF của phiên có an toàn không?
Tôi muốn sử dụng AJAX cho một số yêu cầu POST, nhưng các yêu cầu đã nói không có availabnle mã thông báo CSRF. Các trang không có các yếu tố <form>
để móc vào và tôi không muốn làm mờ việc đánh dấu chèn mã thông báo dưới dạng giá trị ẩn. Tôi tìm một cách tốt để làm điều này là để lộ ra một vew như /get-csrf-token/
để trả lại mã thông báo của người dùng, dựa trên các quy tắc tập lệnh cross-site của trình duyệt để ngăn các trang web thù địch yêu cầu nó.
Đây có phải là một ý tưởng hay không? Có cách nào tốt hơn để bảo vệ chống lại các cuộc tấn công CSRF trong khi vẫn cho phép các yêu cầu AJAX?
Thẻ CSRF sẽ thay đổi với mọi thao tác. Bạn có đề xuất rằng mỗi thao tác cập nhật mã thông báo? Điều đó không có nghĩa là các hoạt động của người dùng sẽ phải trở thành đồng bộ (thứ hai không thể bắt đầu cho đến khi lần đầu tiên quay trở lại và đưa ra mã thông báo csrf mới). – Mystic
Đây không phải là câu trả lời hay nhất. Như Carl Meyer nói trong câu trả lời của ông: không cần phải bảo vệ các yêu cầu AJAX từ CSRF bằng cách sử dụng một mã thông báo * trong Django *, như Django đã bảo vệ các yêu cầu AJAX theo một cách khác. Điều này cũng loại bỏ mối quan tâm Mystics. – hopla
có thể điều này sẽ giúp, ngay cả khi tôi không sắp xếp câu chuyện này về ajax & CSRF http://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax – amirouche