2012-07-23 31 views
7

Là người mới bắt đầu sử dụng cookie, CSRF và Django (sử dụng 1.4), từ những gì tôi có thể thực hiện được, làm thế nào để sửa lỗi ...Đây có phải là cách bảo vệ CSRF của Django hoạt động không?

Sau đây áp dụng nơi django.middleware. csrf.CsrfViewMiddleware được bao gồm trong bộ MIDDLEWARE_CLASSES.

đâu một hình thức POST bao gồm thẻ csrf_token, và quan điểm liên quan đi RequestContext để mẫu, yêu cầu trang có nghĩa là Django bao gồm một trường mẫu ẩn chứa một chuỗi chữ và số. Django cũng trả lại cho trình duyệt một cookie có tên được đặt là csrftoken và giá trị được đặt thành cùng một chuỗi chữ và số.

Khi nhận được gửi biểu mẫu, Django kiểm tra giá trị chuỗi chữ và số từ trường biểu mẫu ẩn khớp với cookie csrftoken nhận được từ trình duyệt. Nếu họ không phù hợp với một phản ứng 403 được ban hành.

Tấn công CSRF có thể có dạng trang web độc hại bao gồm iframe. Khung nội tuyến bao gồm biểu mẫu POST và một số JavaScript. Các điểm thuộc tính của action của biểu mẫu đến trang web Django của tôi. Biểu mẫu được thiết kế để làm điều gì đó khó chịu tại trang web của tôi và JS gửi biểu mẫu khi khung nội tuyến được tải.

Trình duyệt sẽ bao gồm cookie csrftoken trong tiêu đề gửi biểu mẫu. Tuy nhiên, biểu mẫu sẽ không bao gồm trường ẩn với chuỗi ký tự chữ và số phù hợp, do đó, 403 được trả về và cuộc tấn công không thành công. Nếu iframe JS cố gắng truy cập cookie, để tạo trường biểu mẫu ẩn đúng, trình duyệt sẽ ngăn không cho nó làm như vậy.

Điều này có đúng không?

+1

Tôi không thấy điều gì sai. Có lẽ những người khác sẽ, nhưng nói chung, bạn đã có nó. – Zashas

Trả lời

0

tôi sẽ nói rằng bạn là đúng. Bạn sẽ tìm thấy here công thức của riêng tôi về nó.

Để tóm tắt:

  • Các CSRF token được gửi từ các mã, có nghĩa là các mã độc hại phải biết điều đó.
  • Mã thông báo CSRF được lưu trữ trong cookie và được gửi bởi trình duyệt.
  • Kẻ tấn công không thể truy cập cookie vì chính sách có cùng nguồn gốc.
  • Máy chủ chỉ có thể xác minh rằng giá trị "an toàn" đến từ cookie giống với giá trị đến từ mã.
1

Tôi nghĩ những gì bạn muốn được mô tả ở đây trong Tài liệu chính thức của Django. https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#how-it-works

Trên liên kết bị phá vỡ khi tôi đã cố gắng, nhưng đối với phiên bản 1.7 này làm việc: https://docs.djangoproject.com/en/1.7/ref/contrib/csrf/

+1

Cảm ơn bạn đã liên kết. Nó nói "Điều này đảm bảo rằng chỉ có các biểu mẫu có nguồn gốc từ trang web của bạn mới có thể được sử dụng để POST dữ liệu trở lại." nhưng nó không nói _how_ nó đảm bảo điều đó. –

+0

Tôi đã không xem xét một phần của cơ sở mã Django gần đây, nhưng nếu tôi biết từ nơi khác, nó sử dụng UrlParse để phát hiện url cơ sở và nếu URL cơ sở không khớp với URL của máy chủ, nó sẽ trả về lỗi hoặc âm thầm không thành công. (Nó âm thầm thất bại khi bạn cố gắng trả về một phản hồi cho một chương trình khác như foo: // – fundamol

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