2010-04-20 7 views
5

Gần đây tôi đã bắt đầu làm việc trên Django và bây giờ ứng dụng của tôi sắp hoàn thành và tôi đã bắt đầu tự hỏi về bảo mật và các phương pháp hay nhất.Bảo mật xem Django và thực hành tốt nhất

Tôi có chế độ xem tạo ra một trang và các chức năng khác nhau trong yêu cầu AJAX của trang gửi cho các chế độ xem riêng lẻ. Ví dụ, tôi có một cái nhìn gọi là show_employees và tôi có thể xóa và cập nhật nhân viên bằng cách chuyển một yêu cầu bài viết tới các khung nhìn delete_employee và update_employee.

  1. Tôi đã đặt @login_required trang trí trước mỗi chế độ xem này vì tôi không muốn bất kỳ ai truy cập chúng mà không được xác thực. Điều này có được không?

  2. Trong chế độ xem delete_employee và update_employee, tôi chỉ trả lời yêu cầu nếu đó là yêu cầu POST của AJAX (bằng is_ajax()). Điều này có được không?

  3. Tôi trả về 'thành công' khi chế độ xem thành công khi thực hiện những gì cần và lỗi khi có lỗi Xác thực trong biểu mẫu của tôi nhưng tôi vẫn không xử lý các ngoại lệ khác. Làm thế nào tôi nên làm điều này? Tôi có nên trả lại trang chuẩn 500 thông qua phản hồi AJAX như this bằng cách đóng khung xem bằng khối thử-trừ để xử lý tất cả ngoại lệ không?

  4. Tôi có thể làm gì khác để đảm bảo chế độ xem của mình không?

Dưới đây là một cái nhìn mẫu của tôi:

@login_required 
    def add_site(request): 
     data = {} 
     if request.method == 'POST': 
      if request.is_ajax(): 
       form = AddSiteForm(request.user, request.POST) 
       if form.is_valid(): 
        site = form.save(commit=False) 
        site.user = request.user 
        site.save() 
        data['status'] = 'success' 
        data['html'] = render_to_string('site.html', locals(), context_instance=RequestContext(request)) 
        return HttpResponse(simplejson.dumps(data), mimetype='application/json') 
       else: 
        data['status'] = 'error' 
        data['errors'] = {} 
        for field, error in form.errors.iteritems(): 
         data['errors']['id_'+field] = strip_tags(unicode(error)) 
        return HttpResponse(simplejson.dumps(data), mimetype='application/json') 

Cảm ơn bạn.

Trả lời

11

Vâng, thay vì chỉ sử dụng @login_required, tôi khuyên bạn nên xem permissions framework và liên kết permission required decorator. Bằng cách này, bạn có thể tinh chỉnh các giới hạn truy cập trên cơ sở người dùng hoặc nhóm. Nó cũng dễ dàng hơn và an toàn hơn để thay đổi hành vi người dùng sau đó với quyền hơn là chỉ với một trang trí đăng nhập. Giả sử bây giờ bạn chỉ có quản trị viên, nhưng sau đó bạn muốn thêm các loại người dùng khác, thật dễ dàng sau đó bỏ lỡ trình trang trí login_required rồi cấp cho những người dùng đó quyền truy cập vào chế độ xem quản trị viên. Bạn sẽ không gặp vấn đề này với quyền được xác định đúng.

Tiếp theo, is_ajax chỉ kiểm tra tiêu đề HTTP_X_REQUESTED_WITH. Điều này không thực sự liên quan đến bảo mật, nhưng với hành vi thân thiện với người dùng. Bằng cách này, bạn ngăn người dùng bình thường vô tình mở trang đó trong trình duyệt và nhận một số dữ liệu lạ. Nó không giúp bất cứ điều gì trong an ninh, mọi hacker đều có thể thiết lập một tiêu đề HTTP bổ sung :).

Không xử lý ngoại lệ có thể nguy hiểm, nếu bạn vô tình để lại trên DEBUG=True, trong trường hợp đó django sẽ cung cấp các đoạn mã và backtraces, có khả năng cho điểm yếu. Nhưng, nếu tùy chọn này tắt django sẽ hiển thị trang lỗi 500 của chính nó. Đề nghị của tôi là: tìm kiếm tất cả các ngoại lệ django dự kiến ​​(không phải là nhiều) và chắc chắn rằng bạn bắt những người đúng. Hơn nữa tôi muốn nói, hãy để ngoại lệ khác được xử lý bởi django, django sẽ vẫn cung cấp khả năng tạo backtraces và thông tin gỡ lỗi khác và gửi chúng cho quản trị viên thay vì hiển thị chúng trên trang web. Nếu bạn bắt gặp tất cả các lỗi không mong muốn, hành vi này sẽ không có sẵn trực tiếp, có thể khiến bạn không biết về mã lỗi.

Cuối cùng, khi bạn đang làm việc với dữ liệu đầu vào của người dùng, tôi khuyên bạn hãy xem security chapter trong sách django, nó giải thích các mối đe dọa quan trọng nhất và cách xử lý chúng trong khung công tác django.