2010-08-25 69 views
5

Các biểu mẫu có sử dụng phương thức POST bắt buộc phải có bảo vệ CSRF không? Tôi đang theo dõi một cuốn sách và các ví dụ mã ném 403 lỗi. Tôi đã thực hiện một số tìm kiếm và có vẻ như tôi cần bật CSRF trong tất cả các biểu mẫu của mình.Django: biểu mẫu POST yêu cầu CSRF? GET không?

Câu hỏi của tôi là:

  1. Liệu Django hiện yêu cầu tất cả các hình thức POST được bảo vệ khỏi CSRF?

  2. Tất cả những gì tôi cần làm để thực hiện việc này là thêm 'django.middleware.csrf.CsrfViewMiddleware', trả về render_to_response (mẫu, từ điển, context_instance = RequestContext (yêu cầu) và thêm '{% csrf_token%}' vào hình thức tương ứng? tôi có thiếu bất cứ điều gì ở đây?

Khi tôi làm điều này, hình thức hoạt động tốt. Khi bất kỳ những mảnh là mất tích, nó không 403. tôi chỉ muốn chắc chắn rằng tôi đang làm nó QUYỀN. :)

Xin cảm ơn trước.

chỉnh sửa:

Vì lý do nào đó mã này không có ý nghĩa với tôi nhưng nó không trả về bất kỳ lỗi nào. Vui lòng bỏ qua xác thực nguyên thủy vì tôi chưa đến phần của cuốn sách, nơi nó cho thấy cách hiệu quả hơn để làm điều đó.

def contact(request): 
    errors = [] 

    if request.method == 'POST': 
     if not request.POST.get('subject',''): 
      errors.append('Enter a subject') 
     if not request.POST.get('message',''): 
      errors.append('Enter a message') 
     if request.POST.get('email', '') and '@' not in request.POST['email']: 
      errors.append('Enter a valid email address') 
     if not errors: 
      send_mail(
       request.POST['subject'], 
       request.POST['message'], 
       request.POST.get('email', '[email protected]'), ['[email protected]'],) 
      return HttpResponseRedirect('/contact/thanks/') 

    return render_to_response('contact_form.html', { 'errors': errors }, context_instance=RequestContext(request)) 

Vấn đề của tôi là với dòng cuối cùng của chức năng chế độ xem này. Nó chỉ được gọi nếu request.method! = POST. Điều này có vẻ hoàn toàn sai với tôi. Tôi không nên gọi "context_instance = RequestContext (yêu cầu)" khi nó đang thực hiện POST?

Trả lời

7

Bài đăng nên được sử dụng cho thông tin nhạy cảm, chẳng hạn như mật khẩu và django yêu cầu bảo mật thông tin đó bằng csrf_token; GET nên được sử dụng cho các nội dung có thể đánh dấu trang mà không cần phải được bảo mật, như tìm kiếm. Bạn đã làm nó đúng rồi đấy.

EDIT

Bạn không nên gọi context_instance=RequestContext(request) khi nó đang làm một POST, bạn nên gọi đó là không phụ thuộc vào loại yêu cầu. Nhìn vào nó như thế này:

  • Đây có phải là POST? điều này có nghĩa là biểu mẫu đã được gửi. chúng tôi xác thực biểu mẫu và chuyển hướng người dùng đến trang khác nếu biểu mẫu là OK hoặc hiển thị lại biểu mẫu cho người dùng, với lỗi.
  • Đây có phải là GET không? điều này có nghĩa là biểu mẫu không được gửi, nhưng những thứ khác đang xảy ra mà chúng tôi không quan tâm (một số liên kết giới thiệu hoặc các nội dung khác). Hiển thị biểu mẫu anyway

Hành động in nghiêng được thực hiện bởi lần trả cuối cùng, bất kể nếu.

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