Khắc Phục Lỗ Hổng CSRF Trong Django

Bài viết này sẽ giới thiệu về lỗ hổng CSRF và cách sử dụng các decorator trong Django để bảo vệ ứng dụng web.

Tổng Quan Về CSRF

CSRF (Cross-Site Request Forgery) là một dạng tấn công mà kẻ xấu lợi dụng danh tính của người dùng đã đăng nhập để gửi các yêu cầu không mong muốn đến trang web. Tấn công CSRF khác với XSS ở chỗ nó dựa vào việc giả mạo yêu cầu từ người dùng đáng tin cậy thay vì khai thác lỗi trên trang web.

Các Biện Pháp Phòng Chống CSRF

Để phòng chống CSRF, bạn có thể áp dụng các biện pháp như sau:

  • Sử dụng token bí mật trong form để xác thực yêu cầu.
  • Áp dụng phương pháp "double submit cookie" nhằm đảm bảo rằng các yêu cầu chỉ được chấp nhận khi xuất phát từ cùng một domain.
  • Không nên sử dụng phương thức GET cho các hành động thay đổi trạng thái hệ thống, mà nên sử dụng POST.

Sử Dụng CSRF Trong Django

Django cung cấp các công cụ tích hợp để giúp bảo vệ ứng dụng khỏi các cuộc tấn công CSRF. Để cấu hình, bạn cần đảm bảo middleware CSRF được kích hoạt trong file settings.py.

Decorator CSRF Trong Django

from django.views.decorators.csrf import csrf_exempt, csrf_check, ensure_token

# Ví dụ: Bỏ qua kiểm tra CSRF
@csrf_exempt
def my_view(request):
    pass

# Ví dụ: Yêu cầu kiểm tra CSRF
@csrf_check
def secure_view(request):
    pass

# Ví dụ: Đảm bảo cookie CSRF được tạo
@ensure_token
def view_with_cookie(request):
    pass

Ví Dụ Không Kiểm Tra CSRF

from django.views import View
from django.utils.decorators import method_decorator

class ExampleView(View):
    @method_decorator(csrf_exempt)
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request, *args, **kwargs)

    def get(self, request, *args, **kwargs):
        pass

    def post(self, request, *args, **kwargs):
        pass

Ví Dụ Yêu Cầu Kiểm Tra CSRF

@method_decorator(ensure_token)
def safe_get(self, request, *args, **kwargs):
    pass

@method_decorator(csrf_check)
def safe_post(self, request, *args, **kwargs):
    pass

Quy Trình Thực Hiện CSRF

  1. Lấy giá trị csrftoken từ cookie.
  2. Chèn giá trị csrftoken vào request.META.
  3. Kiểm tra xem view có sử dụng decorator csrf_exempt hay không.
  4. Nếu là phương thức GET, HEAD, OPTIONS hoặc TRACE thì bỏ qua kiểm tra CSRF.
  5. Đối với các phương thức khác, lấy giá trị token từ cookie hoặc header và so sánh với giá trị trong request.

Thẻ: Django csrf web-security python-frameworks

Đăng vào ngày 5 tháng 6 lúc 16:42