2015-08-26 28 views
9

Trang web của tôi có chế độ xem POST của AJAX có thể được gọi từ bất kỳ trang nào trên ứng dụng (theo dõi sự kiện). Chế độ xem này được bảo vệ bởi CSRF. Trong một số trường hợp, cookie CSRF không được đặt và cuộc gọi POST không thành công.Django: Buộc mã thông báo CSRF trên tất cả các phản hồi

Thay vì tự trang trí tất cả các chế độ xem với @ensure_csrf_cookie, Tôi đang nghĩ đến việc viết Tôi đã tạo một phần mềm trung gian thực thi Django để đặt cookie CSRF trên tất cả các phản hồi. Cách tiếp cận này có đúng không? Liệu nó có tạo ra một lỗ hổng bảo mật mà tôi không biết?

Cập nhật: đây là mã trung gian:

from django.middleware.csrf import get_token 

class ForceCsrfCookieMiddleware(object): 
    def process_request(self, request): 
     get_token(request) 
+1

an ninh lỗ hổng? Tôi nghĩ là không. Bởi vì bạn chỉ đang triển khai chức năng 'secure_csrf_cookie' trong phần mềm trung gian. Mặc dù, đọc mã nguồn của trang trí đó. – xyres

Trả lời

1

Không, không có vấn đề miễn là bạn không render CSRF token bên trong một hình thức mà bài viết đến một trang web bên ngoài (nhưng điều đó sẽ là một vấn đề anyways, không có vấn đề nơi bạn thực hiện nó). Bạn có thể đặt nó trên một phần mềm trung gian, hoặc một số khung nhìn, hoặc trên tất cả các khung nhìn, nó không quan trọng.

Bảo vệ CSRF chỉ được thực hiện để đảm bảo rằng yêu cầu đến từ trang web của bạn. Bất kể bạn đặt cookie bao lâu một lần, nếu yêu cầu bao gồm mã thông báo CSRF chính xác, điều đó có nghĩa là yêu cầu thực sự đến từ trang web của bạn, bởi vì chỉ trang web của bạn mới có thể truy cập cookie của bạn. (Tất nhiên điều này chỉ nắm giữ nếu bạn không bị rò rỉ CSRF token cho bên thứ ba, ví dụ bằng cách gửi nó đến các trang web khác)

Trong vài lời, đây là cách hoạt động:

  1. Các bộ máy chủ một cookie có giá trị ngẫu nhiên trong phản hồi
  2. Trang web của bạn đọc giá trị đó và gửi tới máy chủ khi đăng dữ liệu
  3. Vì chỉ có thể truy cập cookie từ cùng một miền đã đặt chúng, không có cách nào cho một trang web khác để đọc cookie đó. Do đó, bất cứ khi nào bạn nhận được yêu cầu có mã thông báo csrf đúng, bạn được đảm bảo rằng yêu cầu đó đến từ trang web của bạn.

Đối với một lời giải thích rất tốt của CSRF, có một cái nhìn vào bài viết này: http://www.gnucitizen.org/blog/csrf-demystified/

Các vấn đề liên quan